首页 > 编程笔记 > Java笔记 阅读:29

JPA @Query自定义SQL查询(新手必看)

一般的数据查询功能都可以通过定义方法名的方式来实现。但是有些特殊的场景,可能需要自定义的 SQL 来实现数据查询功能。Spring Data JPA 可以完美支持。

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 时需要注意:

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 注解,确保数据能成功写入数据库。

相关文章