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

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

使用Spring Data Jpa的CriteriaQuery一個陷阱

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

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

例如下述代碼,當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方法中調用where,toPredicate只需要返回條件,外層會調用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使用的一個陷阱的詳細內容,更多關于CriteriaQuery 陷阱的資料請關注好吧啦網其它相關文章!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美好骚综合网| 色88888久久久久久影院| 在线亚洲一区| 老司机精品久久| 日韩国产91| 麻豆精品在线观看| 久久激情婷婷| 丝袜a∨在线一区二区三区不卡| 日本欧美在线看| 国产精品白丝一区二区三区| 久久久久久自在自线| 亚洲欧美日韩高清在线| 日韩一区二区三区精品| 欧美午夜网站| 日韩大片在线观看| 国产高清一区| 国产欧美精品久久| 久久国产中文字幕| 欧美在线看片| 欧美日韩精品在线一区| 综合一区av| 少妇久久久久| 久久国产尿小便嘘嘘| 欧美成人高清| 另类综合日韩欧美亚洲| 亚洲一级大片| 久久国产免费| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 欧美三级精品| 国产日产一区| 中文视频一区| 亚洲高清av| 久久精品国产在热久久| 久热精品在线| 免费国产自久久久久三四区久久| 国产毛片精品久久| 亚洲精品中文字幕99999| 黄色aa久久| 国产精品调教| 亚洲深夜福利在线观看| 日韩精品一区二区三区免费观影 | 成午夜精品一区二区三区软件| 日韩欧美在线精品| 免费视频久久| 亚洲一区观看| 国产美女精品| 在线亚洲欧美| 亚洲欧美日本视频在线观看| 在线日韩一区| 首页国产精品| 久久精品国产久精国产爱| 涩涩涩久久久成人精品| 天堂va蜜桃一区二区三区| 欧美日韩国产在线观看网站| 成人午夜国产| 欧美69视频| 模特精品在线| 综合激情五月婷婷| 日本不卡不码高清免费观看 | 1000部精品久久久久久久久| 欧美精品观看| 免费一级欧美片在线观看网站| 免费精品一区| 精精国产xxxx视频在线野外| 91精品蜜臀一区二区三区在线| 久久亚洲专区| 美日韩精品视频| 日本久久二区| 欧美精品导航| 伊伊综合在线| 亚洲综合国产| 国产区精品区| 久久青青视频| 天堂av在线一区| 国产免费播放一区二区| 欧美视频一区| 国产成人精品亚洲日本在线观看| 欧美日韩色图| 日韩精品高清不卡| 日韩88av| 欧美专区在线| 成人亚洲精品| 国产精品视区| 中文字幕在线高清| 亚洲毛片在线免费| 日韩精品第一区| 快she精品国产999| 精品中文字幕一区二区三区| 婷婷亚洲五月| 久久99精品久久久久久园产越南| 福利片在线一区二区| 亚洲在线一区| 中文字幕人成乱码在线观看| 综合国产在线| 欧美中文一区二区| 美腿丝袜亚洲一区| 亚洲欧美久久精品| 在线日韩中文| 蜜桃精品视频| 日韩精品免费视频一区二区三区| av中文资源在线资源免费观看| 一区二区高清| 精品中文字幕一区二区三区av| 国产精品一区二区免费福利视频| 日韩天堂av| 麻豆久久久久久久| 亚洲欧洲日韩| 亚洲福利国产| 中文字幕在线视频网站| 日本精品另类| 三级欧美在线一区| 不卡中文一二三区| 日韩深夜视频| 国产毛片久久久| 日韩高清在线不卡| 在线亚洲观看| 日韩一级欧洲| 欧美一级精品| 久久久久亚洲| 亚洲成人不卡| 美女久久久精品| 国产精品激情| 久久99蜜桃| 鲁大师精品99久久久| 日本少妇一区二区| 日本久久一区| 亚州av日韩av| 亚洲aa在线| 亚洲a成人v| 91福利精品在线观看| 综合日韩在线| 91av一区| 久久精品三级| 亚洲涩涩在线| 久久要要av| 99久久久久| 亚洲一区二区毛片| 亚洲+小说+欧美+激情+另类| 亚洲18在线| 国产日韩一区| 精品黄色一级片| 日本精品在线中文字幕| 欧美成人高清| 久久都是精品| 国产精选久久| 人人精品亚洲| 免费人成在线不卡| 欧美影院视频| 色综合狠狠操| 国产视频一区三区| 在线精品福利| 麻豆国产91在线播放| 日本国产精品| 亚洲日本国产| 97精品一区| 亚洲三区欧美一区国产二区| 免费看一区二区三区| 在线日韩av| 青青伊人久久| 激情五月综合| 国产精品白丝一区二区三区| 亚洲一级少妇| 日韩一区二区三区四区五区 | 亚洲综合图色| 欧美激情aⅴ一区二区三区| 久久精品99久久无色码中文字幕| 日韩一区二区三区在线看| 成人在线免费观看91| 亚洲一级大片| 欧美日韩中文一区二区| 国产欧美日韩一区二区三区四区| 亚洲91精品| 另类小说一区二区三区| 日韩中文字幕一区二区三区| 精品一区二区三区中文字幕在线| 亚洲一区日韩| 欧美精品日日操| 成人国产精品| 精品午夜av| 亚洲免费专区| 免费日韩av片| 亚洲二区在线| 久久久久午夜电影| 国产中文字幕一区二区三区| 日韩中文字幕| 蜜臀av一区二区在线免费观看| 女生影院久久| 日韩国产在线| 高清一区二区三区| 精品久久在线| 久久中文在线| 精品国产亚洲日本| 精品视频网站| 精品国产中文字幕第一页| 日韩在线成人| 欧美一区二区三区免费看| 色综合视频一区二区三区日韩| 亚洲最大av| 日本午夜精品久久久久| 婷婷综合电影|