JPA @Query自定义SQL查询(新手必看)
一般的数据查询功能都可以通过定义方法名的方式来实现。但是有些特殊的场景,可能需要自定义的 SQL 来实现数据查询功能。Spring Data JPA 可以完美支持。
Spring Data JPA 提供了 @Query 注解,通过注解可以自定义 HQL 或 SQL 实现复杂的数据查询功能。下面通过示例程序演示 @Query 注解实现自定义 SQL 查询。
使用 HQL 时需要注意:
除了按照这种方式传参外,还可以使用 @Param 传值方式:
Spring Data JPA 提供了 @Query 注解,通过注解可以自定义 HQL 或 SQL 实现复杂的数据查询功能。下面通过示例程序演示 @Query 注解实现自定义 SQL 查询。
JPA HQL查询
在对应查询方法上使用 @Query 注解,在注解内写 HQL 来查询内容:@Query("select u from User u") List<User> findALL();在上面的示例中,使用 @Query 注解定义自定义的 HQL 语句,实现自定义 HQL 语句查询。使用 HQL 比原生的 SQL 可读性更强,实现面向对象的方式操作数据。
使用 HQL 时需要注意:
- from 后面跟的是实体类,而不是数据表名;
- 查询字段使用的是实体类中的属性,而不是数据表中的字段;
- select 后面不能跟“*”,应为实体类中的属性。
JPA SQL查询
JPA 除了支持 HQL 语句查询外,还可以直接使用 SQL 语句,这样比较直观,只需再添加一个参数“nativeQuery = true”即可:@Query(value="select * from user u where u.name = ?1",nativeQuery = true) List<User> findByName(String name);上面示例中的“?1”表示方法参数中的顺序,“nativeQuery = true”表示执行原生 SQL 语句。
除了按照这种方式传参外,还可以使用 @Param 传值方式:
@Query(value="select u from User u where u.password = :password") List<User> findByPassword(@Param("password") String password);
JPA修改和删除
除了自定义查询语句外,@Query 注解同样可以用于定义修改和删除语句,只不过还需要加上 @Modifying 注解。示例代码如下:@Modifying @Query("update User set userName = ?1 where id = ?2") int modifyById(String userName, Long id); @Modifying @Query("delete from User where id = ?1") void deleteUserById(Long id);在上面的示例中,自定义 delete 和 update 语句需要添加 @Modifying 注解。需要注意的是,使用时需要在 Repository 或者更上层增加 @Transactional 注解,确保数据能成功写入数据库。