spring data jpa的動態查詢封裝

2021-08-27 15:54:55 字數 4689 閱讀 1072

最近使用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...