日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java能写复杂的查询么_spring-data-jpa 复杂查询的写法(包含or的查询)

發(fā)布時(shí)間:2025/3/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java能写复杂的查询么_spring-data-jpa 复杂查询的写法(包含or的查询) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

場景如下:很簡單的CMS常用查詢,欄目下有多個(gè)子欄目,子欄目有包含內(nèi)容。

public?class?Channel{

....

private?String?parentIds;//所有的父節(jié)點(diǎn),簡化查詢策略?例如?0,1,11,

private?List?channels?=?Lists.newArrayList();?//所有的兒子欄目

...

}

public?class?Content{

private?Channel?channel;?//屬于哪個(gè)欄目

}

所以比如有如下結(jié)構(gòu)時(shí):欄目A下有兩個(gè)子欄目B,C;這三個(gè)欄目下都有各自的內(nèi)容, 那么當(dāng)查詢A下的內(nèi)容時(shí),肯定也是要包含B,C欄目下的內(nèi)容。

比如說A欄目的id是 10 ,再加上別的查詢條件的話, 也就是說 sql 語句肯定是類似:

select?*?from?Content?as?s?where?(s.channel.id?=?10?or?s.channel.parentIds?like?'%,10,%')?and?s.yyy?=?'xxxxx'?and?s.xxx?=?'yyyy';

想來想去發(fā)現(xiàn)實(shí)在沒有簡單的辦法做or查詢之后跟動(dòng)態(tài)的and查詢參數(shù),好像只能自己構(gòu)造,所以在此記錄一下,避免忘記。

此處動(dòng)態(tài)的and 查詢條件構(gòu)造是使用了springside的方法。并且我不知道這樣的構(gòu)造方法是不是spring-data-jpa的標(biāo)準(zhǔn)做法,如果不是,請指正

/**

*?查詢某個(gè)欄目下的所有文章,并且分頁。

*

*?如該欄目下有子欄目,則需要一起顯示

*

*?@param?channelId?欄目id

*?@param?searchParams

*?@param?pageNumber

*?@param?pageSize

*?@return

*/

public?Page?getContentListPaged(final?Integer?channelId,final?Collection?filters,int?pageNumber,?int?pageSize){

return?contentDao.findAll(new?Specification(){

@Override

public?Predicate?toPredicate(Root?root,

CriteriaQuery>?query,?CriteriaBuilder?builder)?{

//path轉(zhuǎn)化

List?orPredicates?=?Lists.newArrayList();

Path?idPath?=?root.get("channel").get("id");

Path?parentIdsPath?=?root.get("channel").get("parentIds");

Predicate?p1?=?builder.equal(root.get("channel").get("id"),?channelId);

orPredicates.add(builder.or(p1));

Predicate?p2?=?builder.like((Path)root.get("channel").get("parentIds"),?"%,"?+?channelId?+?",%");

orPredicates.add(builder.or(p2));

//以下是springside3提供的方法

Predicate?o?=?DynamicSpecifications.bySearchFilter(filters,?Content.class).toPredicate(root,?query,?builder);

Predicate?p?=?builder.or(orPredicates.toArray(new?Predicate[orPredicates.size()]));

query.where(p,o);

return?null;

}

},?new?PageRequest(pageNumber?-?1,?pageSize));

}

實(shí)際查詢的輸出sql如下,where之前省略:

where

content0_.channel_id=channel1_.id

and?(

content0_.channel_id=21

or?channel1_.parentIds?like??

)

and?(

content0_.title?like??

)?limit??

另一個(gè)使用案例:

前端返回的查詢結(jié)構(gòu):{"字段名1":"字段值1","字段名2":"字段值2"}

Sort sort = new Sort(Sort.Direction.DESC, "id");

Pageable pageable = new PageRequest(page<0?0:page, size<0?1:size, sort);

if(filters != null){

JSONObject params = JSON.parseObject(filters);

Set keys = params.keySet();

if(keys.size() > 0){

Specification spec = new Specification() {

public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder cb) {

List andPredicates = Lists.newArrayList();

for(String key : keys){

if(StringUtils.isNotBlank(params.getString(key)))andPredicates.add(cb.like(root.get(key),"%"+params.getString(key)+"%"));

}

Predicate p = cb.and(andPredicates.toArray(new Predicate[andPredicates.size()]));

query.where(p);

return null;

}

};

return logViewManager.findAll(spec,pageable);

}

}

總結(jié)

以上是生活随笔為你收集整理的java能写复杂的查询么_spring-data-jpa 复杂查询的写法(包含or的查询)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。