有时候需要通过Jpa进行复杂的查询,做个记录汇总,后面以便于可以进行查阅;
1.首先Repository需要继承接口JpaSpecificationExecutor<T>,这里的T是具体的entity实例;这样就可以使用该接口提供的这些方法,进行复杂查询;相比JPQL,其优势是类型安全,更加的面向对象
可以看到这个接口基本是围绕着Specification接口来的;
2.Specification
Specification中有一些默认的实现,接口只有一个就是toPredicate方法;在默认的实现中,我们可以针对查询条件进行与或非多个条件的联合查询;
3.最佳实践
我们可以定义一个类(最好以specs结尾),里面实现各种查询的静态方法,返回一个Specification的实现就可以了,比如
然后查询的时候直接使用这样就可以了;
resourcesRepository.findAll(ResourcesSpecs.test(),pagable);
如果是多个条件查询,比如再增加一个查询条件;
上面的test方法再java8可以进行简化,替换成lamb表达式
这里的CriteriaBuilder提供了多种方法,如下所示,这里只是演示了Resource的name字段等于aaa的查询条件;
4.针对关联的查询,可以join之后再进行判断,例如,这里的root是代表跟对象Resource,得到的join对象包含了子对象的属性