详细讲解声明式的查询方法数据库
1 @Query详解express
使用命名查询为实体声明查询是一种有效的方法,对于少许查询颇有效。通常只须要关心@Query里面的value和nativeQuery的值。使用声明式JPQL查询有一个好处,就是启动的时候就知道语法正确与否。函数
声明一个注解在Repository的查询方法上。3d
Like查询,注意firstname不会自动加上%关键字的对象
直接用原始SQL。blog
nativeQuery不支持直接Sort的参数查询排序
错误方式:接口
正确方式:源码
2.@Query排序it
@Query在JPQL下想实现排序,直接用PageRequest或者直接用Sort参数均可以。
在排序实例中实际使用的属性须要与实体模型里面的字段相匹配,这意味着它们须要解析为查询中使用的属性或别名。这是一个state_field_path_expression JPQL定义,而且Sort的对象支持一些特定的函数。
3.@Query分页
直接用Page对象接收接口,参数直接用Pageable的实现类便可。
2.@Param用法
默认状况下,参数是经过顺序绑定在查询语句上的。这使得查询方法对参数位置的重构容易出错。为了解决这个问题,你可使用@Param注解指定方法参数的具体名称,经过绑定的参数名字作查询条件。
根据参数进行查询。
3.SpEL表达式的支持
在Spring Data JPA 1.4之后,支持在@Query中使用SpEL表达式(简介)来接收变量。
SpEL支持的变量如表4-1所示
在如下的例子中,咱们在查询语句中插入表达式:
这个SpEL的支持比较适合自定义的Repository,若是想写一个通用的Repository接口,那么能够用这个表达式来处理:
4. @Modifying修改查询
能够经过在@Modifying注解实现只须要参数绑定的update查询执行:
简单地针对某些特定属性的更新也能够直接用基类里面提供的通用save。还有第三种方法,就是自定义Repository,使用EntityManager来进行更新操做。用法以下:
5 @QueryHints
有不少数据库支持Hint Query的语法,不过这种查询支持比较老旧,感受应该会慢慢被淘汰,工做中不多有人使用。Spring Data JPA仍是作了很好的支持,它只支持一些固定的HintValue值,用来优化Query的做用。有两个注解须要了解和知道一下@QueryHints,value等于多个@QueryHint。
用法以下:
6 @Procedure储存过程的查询方法
咱们经过@Procedure来介绍一下JPA对储存过程的支持
(1)@Procedure源码以下:
(2)首先建立一个储存过程名字plus1inout,有两个参数、两个结果。
(3)使用@NamedStoredProcedureQueries注释来调用存储过程。这个必须定义在一个实体上面。
关键要点:
存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
procedureName是存储过程的名字。
name是JPA中存储过程的名字。
使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数。
(4)直接经过自定义过的Repository完成储存过程的调用。
关键要点:
@Procedure的procedureName参数必须匹配
@NamedStoredProcedureQuery的procedureName。
@Procedure的name参数必须匹配@NamedStoredProcedureQuery的name。
@Param必须匹配@StoredProcedureParameter注释的name参数。
返回类型必须匹配:in_only_test存储过程返回是void,in_and_out_test存储过程必须返回String
7 @NamedQueries预约义查询
在@Entity下增长@NamedQuery定义
须要注意,query里面的值也是JPQL。查询参数也要和实体对应起来。由于实际场景中这种破坏Entity的侵入式很不美,也不方便,因此这种方式容易遗忘,工做中也不多推荐。
与之相对应的还有@NamedNativeQuery。用法同样,惟一不同样的是,query里面放置的是原生SQL语句,而非实体的字段名字