1.@Query详解
@Query用法
声明个查询方法
模糊查询
原生SQL查询
@Query排序
@Query在JPQL下想实现排序,直接用PageRequest或者直接用Sort参数都可以。
在排序实例中实际使用的属性需要与实体模型里面的字段相匹配,这意味着它们需要解析为查询中使用的属性或别名。这是一个state_field_path_expression JPQL定义,并且Sort的对象支持一些特定的函数。
@Query分页
对原生SQL(以MySQL为例)的分页支持示例,但是支持得不是特别友好。
2.@Param
默认情况下,参数是通过顺序绑定在查询语句上的。这使得查询方法对参数位置的重构容易出错。为了解决这个问题,你可以使用@ Param注解指定方法参数的具体名称,通过绑定的参数名字做查询条件。
3.@Modifying
可以通过在@Modifying注解实现只需要参数绑定的update查询的执行:
对删除也同样支持
4.@QueryHints
有很多数据库支持Hint Query的语法,不过这种查询支持比较老旧,感觉应该会慢慢被淘汰,工作中很少有人使用。Spring Data JPA还是做了很好的支持,它只支持一些固定的HintValue值,用来优化Query的作用。有两个注解需要了解和知道一下@QueryHints, value等于多个@QueryHint。
QueryHint仅仅了解一下即可,一般的业务场景基本不用。
5.@Procedure
JPA对储存过程的支持
源码:
首先创建一个储存过程名字plus1inout
使用@NamedStoredProcedureQueries注释来调用存储过程。这个必须定义在一个实体上面。
存储过程使用了注释@NamedStoredProcedureQuery,并绑定到一个JPA表。
procedureName是存储过程的名字。
name是JPA中存储过程的名字。
使用注释@StoredProcedureParameter来定义存储过程使用的IN/OUT参数。
直接通过自定义过的Repository完成储存过程的调用。
@Procedure的procedureName参数必须匹配
- @NamedStoredProcedureQuery的procedureName。
- @Procedure的name参数必须匹配@NamedStoredProcedureQuery的name。
- @Param必须匹配@StoredProcedureParameter注释的name参数。
- 返回类型必须匹配:in_only_test存储过程返回是void, in_and_out_test存储过程必须返回String。
6.@NamedQueries预定义查询
1.在@Entity下增加@NamedQuery定义。
需要注意,query里面的值也是JPQL。查询参数也要和实体对应起来。因为实际场景中这种破坏Entity的侵入式很不美,也不方便,所以这种方式容易遗忘,工作中也很少推荐。
与之相对应的还有@NamedNativeQuery。用法一样,唯一不
一样的是,query里面放置的是原生SQL语句,而非实体的字段名字
用法举例
实体类
CustomerRepository里面的写法:
调用者的写法:
@NamedQuery、@Query和方法定义查询的对比
- 1)Spring JPA里面的优先级,@Query > @NameQuery > 方法定义查询。
- 2)推荐使用的优先级:@Query > 方法定义查询 > @NameQuery。
- 3)相同点是都不支持动态条件查询。