Jpa中使用弹簧数据的CriteriaQuery会遇到什么问题

  介绍

今天就跟大家聊聊有关使用弹簧数据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会遇到什么问题有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

Jpa中使用弹簧数据的CriteriaQuery会遇到什么问题