spring data jpa @query和pageable

Awa*_*ing 54 java spring hibernate jpa spring-data-jpa

我正在使用Spring Data JPA,当我@Query用来定义查询WITHOUT时 Pageable,它可以工作:

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%", 
           nativeQuery = true)
    List<UrnMapping> fullTextSearch(String text);
}
Run Code Online (Sandbox Code Playgroud)

但是如果我添加第二个参数Pageable,那么@Query它将不起作用,Spring将解析方法的名称,然后抛出异常 No property full found.这是一个错误吗?

public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {
    @Query(value = "select * from internal_uddi where urn like %?1% or contact like %?1%",
           nativeQuery = true)
    Page<UrnMapping> fullTextSearch(String text, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

Rem*_*usS 38

您可以对本机查询使用分页.它在此处记录:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries

" 但是,您可以通过自己指定计数查询来使用本机查询进行分页:示例59.使用@Query在查询方法中声明分页的本机计数查询 "

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
    countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
    nativeQuery = true)
  Page<User> findByLastname(String lastname, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*eve 30

在Spring论坛上提出了类似的问题,其中指出要应用分页,必须派生第二个子查询.由于子查询引用相同的字段,因此需要确保查询对其引用的实体/表使用别名.这意味着你写的地方:

select * from internal_uddi where urn like
Run Code Online (Sandbox Code Playgroud)

你应该改为:

select * from internal_uddi iu where iu.urn like ...
Run Code Online (Sandbox Code Playgroud)

  • 如果你想编写本机查询,那么你显然需要编写查询来自己进行分页. (9认同)

Dim*_*tot 8

考虑到UrnMapping类被映射到internal_uddi表,我会建议:

@Repository
public interface UrnMappingRepository extends JpaRepository<UrnMapping, Long> {

    @Query(value = "select iu from UrnMapping iu where iu.urn like %:text% or iu.contact like %:text%")
    Page<UrnMapping> fullTextSearch(@Param("text") String text, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

请注意,您可能必须使用动态请求关闭本机查询.


she*_*997 6

如果您使用 Spring Data JPA 2.0.4 及更高版本,请参考:Spring Data JPA @Query 。示例如下:

@Query(value = "SELECT u FROM User u ORDER BY id")
Page<User> findAllUsersWithPagination(Pageable pageable);
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 @Query ,我们也可以在需要在 JPA 方法结束时传递Pageable类的对象的地方使用分页

例如:

Pageable pageableRequest = new PageRequest(page, size, Sort.Direction.DESC, rollNo);
Run Code Online (Sandbox Code Playgroud)

其中,页面 = 页面索引(索引从零开始)
大小 = 记录数
Sort.Direction = 按 rollNo 排序
rollNo = 用户类中的字段

UserRepository repo
repo.findByFirstname("John", pageableRequest);

public interface UserRepository extends JpaRepository<User, Long> {

  @Query(value = "SELECT * FROM USER WHERE FIRSTNAME = :firstname)
  Page<User> findByLastname(@Param("firstname") String firstname, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)