目录
Spring Data提供了多种方式来执行一次数据库请求,其中一个非常有用的就是@Query注解,这篇文章我将展示如何使用@Query注解来执行JPQL和native SQL。
查询
Query注解的value是我们将要执行的JPQL或者是SQL。
JPQL
默认情况下,请求使用JPQL,下面的例子演示了如何从数据库中查询所有用户
@Query("SELECT u FROM User u")
Collection<User> findAllUsers();
Native SQL
@Query(
value = "SELECT * FROM USERS u", nativeQuery = true)
Collection<User> findAllUsersNativeSQL();
注意:我们在@Query注解中设置了nativeQuery = true。注意⚠️区别。
排序
当我们需要使用排序方法的时候我们可以额外给定一个参数Sort用来实现排序查询。使用之后其实就是在查询末尾增加了order by ...
幸运的是JPA已经帮我们实现了一些方法,需要注意的是由于我们使用的是Spring Data 默认提供的方法,在进行排序的时候我们只能使用Entity中定义的属性,例如:
userRepository.findAll(Sort.by(Sort.Direction.ASC, "name"));
JPQL
同样我们定义一个方法,此方法接收一个Sort参数
@Query(value = "SELECT u FROM User u")
List<User> findAllUsers(Sort sort);
我们可以使用name对查询结果进行排序
userRepository.findAllUsers(Sort.by("name"));
JpaSort.unsafe()是Spring Data JPA提供的一个方法,它会绕过Spring Data JPA执行的一些安全检查,在使用时应谨慎,因为在启动的时候并不会检查,所以使用的时候需要当心,防止出现事故的风险。
userRepository.findAllUsers(JpaSort.unsafe("LENGTH(name)"));
Native SQL
当使用Native SQL的时候,我们不能够使用Sort。
org.springframework.data.jpa.repository.query.InvalidJpaQueryMethodException: Cannot use native queries with dynamic sorting and/or pagination
同样,当进行分页查询的时候如果使用Native SQL也会出现类似的错误
下篇文章我们将进行分析。