使用countQuery的Sping Boot JPA原生查询和分页

0ejtzxu1  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(359)

我看过这个使用countQuery的原生查询示例:

public interface UserRepository extends JpaRepository<User, Long> {

 @Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1 ORDER BY ?#{#pageable}",
        countQuery = "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
        nativeQuery = true)
    Page<User> findByLastname(String lastname, Pageable pageable);   
 }

第二个例子:

public interface UserRepository extends JpaRepository<User, Long> {
     @Query(value="SELECT * FROM USERS WHERE LASTNAME = ?1", nativeQuery=true)
     Page<User> findByLastname(String lastname, Pageable pageable);
 }

第二个示例没有使用countQuery,那么最佳实践是什么呢?您能解释一下吗?
我两个都试过了,两个都很好用。最好的做法是什么?

ffscu2ro

ffscu2ro1#

如果它与原始查询相同,则可以忽略它。
来自文档:

计数查询

定义一个特殊的计数查询,该查询将用于分页查询以查找页面的元素总数。如果未配置任何查询,我们将从原始查询或countProjection()查询(如果有)派生计数查询
countQuery在您需要不同的查询来计算总条目数时非常有用(尽管几乎不应该出现这种情况)。
注意,当您有一个Pageable沿着一个非本地查询,并且需要获取延迟加载的关联时,也可能需要countQuery
例如,假设您的User实体有一个延迟加载的registrations关联:
这将不会编译(查询验证将失败,并显示以下错误消息):

@Query(value = "select u from Users u left join fetch u.registrations where lastName = ?1")
Page<User> findByLastname(String lastname, Pageable pageable);

org.hibernate.query.SemanticException:查询指定了连接提取,但提取的关联的所有者不在选择列表中
这将工作:

@Query(value = "select u from Users u left join fetch u.registrations where lastName = ?1",
  countQuery = "select u from Users u left join fetch u.registrations where lastName = ?1")
Page<User> findByLastname(String lastname, Pageable pageable);

(Note您可以在后面的情况下使用@EntityGraph,这只是为了演示需要使用countQuery的情况)。

相关问题