SpringData JPA @Query 注解实现自定义查询方法
需求
【仓库明细表】增加【关联公司】列,取值于【仓库管理】中各仓库对应的【关联公司】;增加【合作期限】列,方便显示仓库合作时间。
实现步骤
从数据库中直接取出关联公司和合作期限赋值给仓库明细表,但是由于合作期限存在多个,需要从中取出时间最近更新的一次,因此采用再数据库中查询按照时间排序取出时间最近的一次。
利用@Query 注解再DAO层中访问数据库查询进行本地查询,使用原生的sql语句需要注意的是设置nativeQuery为true
这种查询可以声明在 Repository 方法中,摆脱像命名查询那样的约束,将查询直接在相应的接口方法中声明,结构更为清晰,这是 Spring data 的特有实现。
Query 注解
- 只需要将
@Query
标记在继承了Repository
的自定义接口的方法上,就不需要遵循查询方法命名规则。 - 支持命名参数及索引参数的使用
- 本地查询
案例
1)查询操作
- 查询 ID 最大的员工信息
@Query("select o from Employee o where id=(select max(id) from Employee t1)")
Employee getEmployeeById();
注意: Query 语句中第一个 Employee
是类名。
- 根据占位符进行查询
注意: 占位符从 1
开始
List<Employee> queryParams1(String name, Integer age);
- 根据命名参数的方式
List<Employee> queryParams2(; String name, Integer age)
- like 查询语句
List<Employee> queryLike1(String name);
(2)更新操作
- 在 DAO 中定义方法根据 Id 来更新年龄(
@Modifying
注解代表允许修改)
void update(; Integer id, Integer age)
(3)删除操作
void delete(; Integer id)
(4)注意
执行更新或者删除操作是需要事物支持,所以通过 service 层来增加事物功能,在 update 方法上添加Transactional 注解。
本地查询
所谓本地查询,就是使用原生的 sql 语句进行查询数据库的操作。但是在 Query 中原生态查询默认是关闭的,需要手动设置为true:
long getCount();