介绍
今天就跟大家聊聊有关使用弹簧数据Jpa中的CriteriaQuery会遇到什么问题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
使用弹簧数据Jpa的CriteriaQuery进行动态条件查询时,可能会遇到一个陷阱,当条件为空时,查询不到任何结果,并不是期望的返回所有结果。这是为什么呢?
例如下述代码,当谓词为空时,返回结果总是为空。
公共接口querybuilder {/* * *创建一个给定限制的连接谓词。 * 0谓词的结合是正确的。 * @param零个或多个谓词限制的限制 * @return和谓词 */谓语(谓语……限制);/* * *创建一个析取给定限制的谓词。 *的析取零谓词是错误的。 * @param零个或多个谓词限制的限制 * @return或谓词 */谓语或谓语……限制); }
所以正确的写法应该这样:
公共PagelistVmhostSpecWithRelationByPage(字符串名称){ Specification 规范=(根、cq、cb)→{ root.join (“user" JoinType.LEFT); root.join (“tenant" JoinType.LEFT); List 谓词=new ArrayList<在(); …… 如果(predicates.isEmpty ()) { cq.where (); 其他}{ cq.where (cb.or(谓词。toArray(新javax.persistence.criteria.Predicate [0]))); } 返回cq.getRestriction (); }; PageRequest pagable=PageRequest。(0 5); Page =vmhostSpecWithRelationDao页。findAll(规范,pagable); 返回页面; }
也能正常工作,但是其实没有必要在toPredicate方法中调用,toPredicate只需要返回条件,外层会调用。
公共接口Specification扩展了可序列化的{/* * *创建一个WHERE子句的查询引用的实体形式的{@link谓词} * {@link根}和{@link CriteriaQuery}。 * * @param根不得{@literal空}。 * @param查询不能{@literal空}。 * @param querybuilder不得{@literal空}。 * @return {@link谓词},{@literal空}。 */@Nullable 谓词toPredicate (Root 根,CriteriaQuery<及# 63;比;查询,querybuilder querybuilder); }
看完上述内容,你们对使用弹簧数据Jpa中的CriteriaQuery会遇到什么问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。