我看过这个使用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
,那么最佳实践是什么呢?您能解释一下吗?
我两个都试过了,两个都很好用。最好的做法是什么?
1条答案
按热度按时间ffscu2ro1#
如果它与原始查询相同,则可以忽略它。
来自文档:
计数查询
定义一个特殊的计数查询,该查询将用于分页查询以查找页面的元素总数。如果未配置任何查询,我们将从原始查询或countProjection()查询(如果有)派生计数查询。
countQuery
在您需要不同的查询来计算总条目数时非常有用(尽管几乎不应该出现这种情况)。注意,当您有一个
Pageable
沿着一个非本地查询,并且需要获取延迟加载的关联时,也可能需要countQuery
。例如,假设您的
User
实体有一个延迟加载的registrations
关联:这将不会编译(查询验证将失败,并显示以下错误消息):
org.hibernate.query.SemanticException:查询指定了连接提取,但提取的关联的所有者不在选择列表中
这将工作:
(Note您可以在后面的情况下使用
@EntityGraph
,这只是为了演示需要使用countQuery
的情况)。