最近使用spring data jpa做了兩個專案,對於動態查詢的不友好做了個類似hibernate的封裝,記錄也分享下
首先定義乙個所有條件的容器,繼承specification
/**
* 定義乙個查詢條件容器
* @author lee
* * @param */
public class criteriaimplements specification
// 將所有條件用 and 聯合起來
if (predicates.size() > 0)
} return builder.conjunction();
} /**
* 增加簡單條件表示式
* @methods name add
* @create in 2012-2-8 by lee
* @param expression0 void
*/public void add(criterion criterion)
}}
然後是各種條件組裝類,我首先做了乙個介面來包裝各種條件
/**
* 條件介面
* 使用者提供條件表示式介面
* @class name criterion
* @author lee
* @create in 2012-2-8
*/public inte***ce criterion
public predicate topredicate(root<?> root, criteriaquery<?> query,
criteriabuilder builder);
}
然後是針對不同型別條件處理的實現
乙個是簡單比較型別的處理
/**
* 簡單條件表示式
* @author lee
* */
public class ******expression implements criterion
public string getfieldname()
public object getvalue()
public operator getoperator()
@suppresswarnings()
public predicate topredicate(root<?> root, criteriaquery<?> query,
criteriabuilder builder)
}else
switch (operator) }
}
乙個邏輯條件計算實現
/**
* 邏輯條件表示式 用於複雜條件時使用,如但屬性多對應值的or查詢等
* @author lee
* */
public class logicalexpression implements criterion
public predicate topredicate(root<?> root, criteriaquery<?> query,
criteriabuilder builder)
/*** 不等於
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression ne(string fieldname, object value, boolean ignorenull)
/*** 模糊匹配
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression like(string fieldname, string value, boolean ignorenull)
/***
* @param fieldname
* @param value
* @param matchmode
* @param ignorenull
* @return
*/public static ******expression like(string fieldname, string value,
matchmode matchmode, boolean ignorenull)
/*** 大於
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression gt(string fieldname, object value, boolean ignorenull)
/*** 小於
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression lt(string fieldname, object value, boolean ignorenull)
/*** 大於等於
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression lte(string fieldname, object value, boolean ignorenull)
/*** 小於等於
* @param fieldname
* @param value
* @param ignorenull
* @return
*/public static ******expression gte(string fieldname, object value, boolean ignorenull)
/*** 並且
* @param criterions
* @return
*/public static logicalexpression and(criterion... criterions)
/*** 或者
* @param criterions
* @return
*/public static logicalexpression or(criterion... criterions)
/*** 包含於
* @param fieldname
* @param value
* @return
*/@suppresswarnings("rawtypes")
public static logicalexpression in(string fieldname, collection value, boolean ignorenull)
******expression ses = new ******expression[value.size()];
int i=0;
for(object obj : value)
return new logicalexpression(ses,operator.or);
}}
使用方法如下
criteriac = new criteria();
c.add(restrictions.like("code", searchparam.getcode(), true));
c.add(restrictions.eq("level", searchparam.getlevel(), false));
c.add(restrictions.eq("mainstatus", searchparam.getmainstatus(), true));
c.add(restrictions.eq("flowstatus", searchparam.getflowstatus(), true));
c.add(restrictions.eq("createuser.username", searchparam.getcreateuser(), true));
c.add(restrictions.lte("submittime", searchparam.getstartsubmittime(), true));
c.add(restrictions.gte("submittime", searchparam.getendsubmittime(), true));
c.add(restrictions.eq("needfollow", searchparam.getisfollow(), true));
c.add(restrictions.ne("flowstatus", caseconstants.case_status_draft, true));
c.add(restrictions.in("solveteam.code",teamcodes, true));
eventdao.findall(c);
其中eventdao為繼承jpaspecificationexecutor的介面類 spring data jpa遇到的坑
1 column註解name最好全寫了,不然遇到像hibernate駝峰和下劃線風格配置變更時會出現找不到屬性,尤其開啟自動建表情況 2 唯讀操作情況,如果對讀取物件進行了屬性修改操作,那麼jpa會認為你要修改這個實體,使用hibernate的情況下回預設執行乙個update的sql,然後你懂得由於...
spring Data Jpa的分頁管理
通過jpa大大簡化了我們對資料庫的開發工作。但是,之前的例子中我們只提到了最簡單的crud 增刪改查 操作。實際上,spring data jpa對於分頁以及排序的查詢也有著完美的支援,接下來,我們來學習如何通過pageable來對資料庫進行分頁查詢。一 pageable 是spring data庫...
SpringData Jpa中count的使用
通常,我們會有統計數量的需求,jpa對一些簡單統計數量的需求通過方法名就可以解析。然而對於稍微複雜的需求則無法通過方法名解析。對於這種需求,還是需要寫sql實現。當我的repository介面繼承jparepository時,缺省會繼承它的乙個count 方法 crudrepository介面中有c...