日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

使用Spring Data Jpa的CriteriaQuery一個陷阱

瀏覽:20日期:2023-08-02 17:10:41

使用Spring Data Jpa的CriteriaQuery進行動態(tài)條件查詢時,可能會遇到一個陷阱,當條件為空時,查詢不到任何結果,并不是期望的返回所有結果。這是為什么呢?

例如下述代碼,當predicates為空時,返回結果總是為空。

public Page<VmhostWithRelationPO> listVmhostSpecWithRelationByPage(String name) { Specification<VmhostWithRelationPO> spec = (root, cq, cb) -> { root.join('user', JoinType.LEFT); root.join('tenant', JoinType.LEFT); List<javax.persistence.criteria.Predicate> predicates = new ArrayList<>(); ...... return cb.or(predicates.toArray(new javax.persistence.criteria.Predicate[0])); }; PageRequest pagable = PageRequest.of(0, 5); Page<VmhostWithRelationPO> page = vmhostSpecWithRelationDao.findAll(spec, pagable); return page;}

看下or的注釋就明白了,因為空條件總是為false,而and的空條件總是為true。所以,如果最后是and就沒有問題,只有or的時候有問題。

public interface CriteriaBuilder { /** * Create a conjunction of the given restriction predicates. * A conjunction of zero predicates is true. * @param restrictions zero or more restriction predicates * @return and predicate */ Predicate and(Predicate... restrictions); /** * Create a disjunction of the given restriction predicates. * A disjunction of zero predicates is false. * @param restrictions zero or more restriction predicates * @return or predicate */ Predicate or(Predicate... restrictions);}

所以正確的寫法應該這樣:

public Page<VmhostWithRelationPO> listVmhostSpecWithRelationByPage(String name) { Specification<VmhostWithRelationPO> spec = (root, cq, cb) -> { root.join('user', JoinType.LEFT); root.join('tenant', JoinType.LEFT); List<javax.persistence.criteria.Predicate> predicates = new ArrayList<>(); ...... return predicates.isEmpty() ? cb.conjunction() : cb.or(predicates.toArray(new javax.persistence.criteria.Predicate[0])); }; PageRequest pagable = PageRequest.of(0, 5); Page<VmhostWithRelationPO> page = vmhostSpecWithRelationDao.findAll(spec, pagable); return page; }

如果條件為空則返回一個空conjunction,也就是空的and,總是為true。

公司項目的代碼中常見這種寫法:

public Page<VmhostWithRelationPO> listVmhostSpecWithRelationByPage(String name) { Specification<VmhostWithRelationPO> spec = (root, cq, cb) -> { root.join('user', JoinType.LEFT); root.join('tenant', JoinType.LEFT); List<javax.persistence.criteria.Predicate> predicates = new ArrayList<>(); ...... if (predicates.isEmpty()) { cq.where(); } else { cq.where(cb.or(predicates.toArray(new javax.persistence.criteria.Predicate[0]))); } return cq.getRestriction(); }; PageRequest pagable = PageRequest.of(0, 5); Page<VmhostWithRelationPO> page = vmhostSpecWithRelationDao.findAll(spec, pagable); return page;}

也能正常工作,但是其實沒有必要在toPredicate方法中調(diào)用where,toPredicate只需要返回條件,外層會調(diào)用where。

public interface Specification<T> extends Serializable { /** * Creates a WHERE clause for a query of the referenced entity in form of a {@link Predicate} for the given * {@link Root} and {@link CriteriaQuery}. * * @param root must not be {@literal null}. * @param query must not be {@literal null}. * @param criteriaBuilder must not be {@literal null}. * @return a {@link Predicate}, may be {@literal null}. */ @Nullable Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);}

本文作者: 鐘潘本文鏈接: http://zhongpan.tech/2020/07/20/035-a-trap-for-using-criteriaquery/

以上就是CriteriaQuery使用的一個陷阱的詳細內(nèi)容,更多關于CriteriaQuery 陷阱的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
中文字幕人成乱码在线观看| 一区二区亚洲精品| 牛牛精品成人免费视频| 久久国产乱子精品免费女| 国产一区一一区高清不卡| 精品日韩在线| 日韩高清三区| 日韩欧美美女在线观看| 国产一区二区三区不卡av | 国产v综合v| 亚洲欧洲美洲国产香蕉| 国产一区二区三区四区五区| 国产日韩欧美一区二区三区在线观看| 久久久久伊人| 蜜芽一区二区三区| 在线看片国产福利你懂的| 国产一区二区三区四区五区 | 欧美日韩视频免费看| 欧美日中文字幕| 久久九九精品| 日韩avvvv在线播放| 免费中文字幕日韩欧美| 精品久久影院| 亚洲免费成人av在线| 国产成人精品福利| 欧美偷窥清纯综合图区| 日本不卡不码高清免费观看| 精品国产欧美日韩一区二区三区| 国产尤物精品| 欧美有码在线| 日本精品国产| 国产精品久久久久久久久久白浆| 91久久久久| 欧美精选一区二区三区| 亚洲精品一二三**| 水蜜桃久久夜色精品一区的特点| 日韩一区亚洲二区| 国产精品一二| 国产精品白丝一区二区三区| 国产精品网在线观看| 水野朝阳av一区二区三区| 亚洲专区视频| 蜜臀久久99精品久久久画质超高清| 国产一区二区三区国产精品| 久久丁香四色| 国产视频欧美| 亚洲精品麻豆| 欧美黑人做爰爽爽爽| 免费视频一区二区| 在线午夜精品| 激情婷婷亚洲| 久久激情婷婷| 日韩国产欧美视频| 欧美sss在线视频| 自拍自偷一区二区三区| 精品色999| 伊人影院久久| 欧美aaaaaa午夜精品| 亚洲欧美专区| 蜜臀久久99精品久久久久久9| 午夜久久av| 亚洲毛片在线| 亚洲一区av| 久久狠狠久久| 婷婷成人在线| 欧美国产日韩电影| 视频一区视频二区中文字幕| 国产精品巨作av| 麻豆成全视频免费观看在线看| 亚洲激情二区| 国产免费久久| 精品久久中文| 99精品视频在线| 波多野结衣一区| 精品日产乱码久久久久久仙踪林| 日韩理论视频| 亚洲男女自偷自拍| 日韩精品一二区| 亚洲一二三区视频| 国产精品3区| 日本精品不卡| 黄色在线网站噜噜噜| 国产欧美精品久久| 欧美在线亚洲| 国产欧美自拍| 久久久9色精品国产一区二区三区| sm久久捆绑调教精品一区| 97精品97| 亚洲精品少妇| 国产精品入口久久| 欧美aa一级| 国产精品成人**免费视频| 日韩在线一区二区| 精品99在线| 麻豆成人在线| 一区二区亚洲精品| 99精品视频在线观看免费播放| 四虎8848精品成人免费网站 | 精品三级久久| 久久国产精品色av免费看| 欧美国产先锋| 91精品91| 久久国内精品自在自线400部| 日本va欧美va瓶| 久久久久久久久成人| 国产精品网站在线看| 福利一区在线| 999视频精品| 亚洲精品2区| 蜜桃伊人久久| 日本成人在线不卡视频| 精品久久在线| 中文精品视频| 欧美精品影院| 视频在线不卡免费观看| 久久都是精品| 日本美女一区| 夜夜精品视频| 久久久久久久久丰满| 麻豆传媒一区二区三区| 日韩视频精品在线观看| 日韩成人精品一区二区| 蜜臀国产一区二区三区在线播放| 国产亚洲一区二区手机在线观看| 在线视频免费在线观看一区二区| 一区二区国产在线观看| 国产精品**亚洲精品| 91福利精品在线观看| 视频一区中文字幕精品| 久久影院资源站| 亚洲视频电影在线| 亚洲激情国产| 午夜欧美精品久久久久久久| av资源新版天堂在线| 美女黄网久久| 奇米色欧美一区二区三区| 色综合视频一区二区三区日韩 | 国产欧美在线观看免费| 中文无码日韩欧| 日韩毛片网站| 国产情侣一区| 国产成人精品免费视| 日韩在线播放一区二区| 亚洲精品裸体| 日本aⅴ免费视频一区二区三区| 天堂久久av| 日韩毛片一区| 久久久久久自在自线| 精品中文一区| 久久精品日韩欧美| 国产精品调教| 午夜久久av | 亚洲精品乱码| 快she精品国产999| 日本亚洲视频| 亚洲日本久久| 999久久久免费精品国产| 午夜久久99| 日本久久精品| 99精品一区| 亚洲国产一区二区三区在线播放| 欧美亚洲激情| 国产日韩高清一区二区三区在线| 日韩av免费| 国产aⅴ精品一区二区三区久久| 亚洲一区二区三区高清不卡| 久久精品99久久久| 国产精品二区影院| 国产精品视频一区二区三区综合| 欧美亚洲自偷自偷| 国产欧美久久一区二区三区| 国产欧美一区二区三区国产幕精品| 国产三级一区| 国产精品专区免费| 久久精品动漫| 欧美日韩免费观看一区=区三区| 麻豆国产欧美日韩综合精品二区| 午夜欧美理论片| 国产精品va| 亚洲精品自拍| 久久中文字幕导航| 亚洲一区国产| 国产精品99久久久久久董美香| 麻豆精品视频在线观看| 日韩和的一区二在线| 亚洲无线一线二线三线区别av| sm捆绑调教国产免费网站在线观看| aa国产精品| 丝袜美腿亚洲一区| 三级精品视频| 乱一区二区av| 欧美成人久久| 精品久久一区| 国产欧美日韩综合一区在线播放| 日韩动漫一区| 日韩在线观看一区二区三区| 欧美国产偷国产精品三区| 国产精东传媒成人av电影| 91精品韩国| 欧美亚洲色图校园春色|