SpringData JPA @Query 注解实现自定义查询方法

需求

【仓库明细表】增加【关联公司】列,取值于【仓库管理】中各仓库对应的【关联公司】;增加【合作期限】列,方便显示仓库合作时间。

实现步骤

从数据库中直接取出关联公司和合作期限赋值给仓库明细表,但是由于合作期限存在多个,需要从中取出时间最近更新的一次,因此采用再数据库中查询按照时间排序取出时间最近的一次。

利用@Query 注解再DAO层中访问数据库查询进行本地查询,使用原生的sql语句需要注意的是设置nativeQuery为true

hezuodate

 这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。

Query 注解

  • 只需要将 @Query 标记在继承了 Repository 的自定义接口的方法上,就不需要遵循查询方法命名规则。
  • 支持命名参数及索引参数的使用
  • 本地查询

案例

anli1

1)查询操作

  • 查询 ID 最大的员工信息
@Query("select o from Employee o where id=(select max(id) from Employee t1)")
Employee getEmployeeById();

注意: Query 语句中第一个 Employee 是类名。

  • 根据占位符进行查询

注意: 占位符从 1 开始

@Query("select o from Employee o where o.name=?1 and o.age=?2")
List<Employee> queryParams1(String name, Integer age);
  • 根据命名参数的方式
@Query("select o from Employee o where o.name=:name and o.age=:age")
List<Employee> queryParams2(@Param("name") String name, @Param("age") Integer age);
  • like 查询语句
@Query("select o from Employee o where o.name like %?1%")
List<Employee> queryLike1(String name);

(2)更新操作

  • 在 DAO 中定义方法根据 Id 来更新年龄(@Modifying 注解代表允许修改)
@Modifying
@Query("update Employee o set o.age = :age where o.id = :id")
void update(@Param("id") Integer id, @Param("age") Integer age);

(3)删除操作

@Modifying
@Query("delete from Employee o where o.id = :id")
void delete(@Param("id") Integer id);

(4)注意

执行更新或者删除操作是需要事物支持,所以通过 service 层来增加事物功能,在 update 方法上添加Transactional 注解。

本地查询

所谓本地查询,就是使用原生的 sql 语句进行查询数据库的操作。但是在 Query 中原生态查询默认是关闭的,需要手动设置为true:

@Query(nativeQuery = true, value = "select count(1) from employee")
long getCount();