春天数据JPA中的动态查询实例

  

春JPA大数据大的简化了我们持久层的开发,但是实际应用中,我们还是需要动态查询的。
  

  

比如,前端有多个条件,这些条件很多都是可选的,那么后端的SQL,就应该是可以定制的,在使用hibernate的时候,可以通过判断条件来拼接SQL (HQL),当然,弹簧数据JPA在简化我们开发的同时,也是提供了支持的。
  

  

通过实现标准二实现的动态查询,需要我们的回购接口继承JpaSpecificationExecutor接口,这是个泛型接口。
  

  

然后查询的时候,传入动态查询参数,分页参数等即可。
  

  

使用起来很简单,不过为了知其所以然,先介绍一下标准API。

  

<强>标准API
  

  

如果编译器能够对查询执行语法正确性检查,那么对于Java对象而言该查询就是类型安全的# 8482;. Java Persistence API (JPA)的2.0版本引入了标准API,这个API首次将类型安全查询引入到Java应用程序中,并为在运行时动态地构造查询提供一种机制。本文介绍如何使用标准API和与之密切相关的元模型API编写动态的类型安全查询。
  

  

在使用弹簧数据JPA的时候,只要我们的回购层继承JpaSpecificationExecutor接口就可以使用规范进行动态查询了,我们先看下JpaSpecificationExecutor接口:
  

        公共接口JpaSpecificationExecutor{   T findOne (Specification规范);   ListfindAll (Specification规范);   PagefindAll (Specification规范,可分页可分页);   ListfindAll (Specification规范、分类排序);   长计数(Specification规范);   }   之前      

可以看到提供了5个方法,方法的参数和返回值已经很明显的表达了其意图。其中的参数,可分页和排序应该是比较简单的,分别是分页参数和排序参数,而重点就是规范参数,先看下这个接口的定义:
  

        公共接口Specification{   谓词toPredicate (Root根,CriteriaQuery<& # 63;比;查询,querybuilder cb);   }      

其中就一个方法,返回的是动态查询的数据结构。
  

        javax.persistence.criteria。谓词toPredicate (javax.persistence.criteria.Root根,   javax.persistence.criteria.CriteriaQuery<& # 63;比;查询   javax.persistence.criteria。querybuilder cb);      

这里使用的都是Java EE中的规范,具体实现本人采用的是Hibernate,当然也可以选择其他实现了JPA规范的数据持久层框架。
  这里需要再次回过头看看标准API中的一些东西:
  

  

标准查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。
  

  

CriteriaQuery接口:代表一个特定的顶层查询对象,它包含着查询的各个部分,比如:选择,,,组,按等注意:CriteriaQuery对象只对实体类型或嵌入式类型的标准查询起作用
  

  

根接口:代表标准查询的根对象,标准查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中从子的句类似
  

  

1:根实例是类型化的,且定义了查询的从子句中能够出现的类型。
  

  

2:查询根实例能通过传入一个实体类型给AbstractQuery.from方法获得。
  

  

3:标准查询,可以有多个查询根。
  

  

4: AbstractQuery是CriteriaQuery接口的父类,它提供得到查询根的方法.CriteriaBuilder接口:用来构建CritiaQuery的构建器对象谓词:一个简单或复杂的谓词类型,其实就相当于条件或者是条件组合
  

  

其中支持的方法非常之强大,下面给出一个示例,大家可以参考一下,同样的,可以根据示例,自己可以写出更为复杂的查询:
  

  

回购接口:
  

        公共接口DevHREmpConstrastDao   扩展JpaRepository JpaSpecificationExecutor   之前      

查询实例1:
  

     /* *   *条件查询时动态组装条件   */私人Specification(在哪里   最终字符串corg,最终字符串名称,最终字符串类型,最后的日期字符串,最终字符串检查){   返回新Specification () {   @Override   公共谓词toPredicate (Root根,CriteriaQuery

春天数据JPA中的动态查询实例