JPA中如何使用分页查询?

在JPA中可以通过使用setFirstResult()和setMaxResults()方法实现分页查询。
setFirstResult():设置查询结果的起始索引,用于跳过前面的数据。
setMaxResults():设置查询结果的最大数量,用于限制返回的数据量。

示例:

String jpql = "SELECT u FROM User u";
Query query = em.createQuery(jpql);
query.setFirstResult(10);   // 跳过前10条数据
query.setMaxResults(20);    // 返回20条数据
List<User> users = query.getResultList(); 

上例会返回User表中的第11-30条数据。
也可以在@NamedQuery注解中设置分页参数:

@NamedQuery(
    name = "findAllUsers",
    query = "SELECT u FROM User u"
) 
@QueryHint(name = "```x.persistence.fetchsize", value = "50") 

调用时直接设置分页参数:

List<User> users = em.createNamedQuery("findAllUsers", User.class)
                      .setFirstResult(10)  
                      .setMaxResults(20)  
                      .getResultList();

另外,可以使用Query接口的setHint()方法设置数据库相关的提示参数,用于优化分页查询的性能:

String jpql = "SELECT u FROM User u"; 
Query query = em.createQuery(jpql);
query.setHint("```x.persistence.fetchsize", 50);  //设置每页返回50条数据
query.setFirstResult(10);  
query.setMaxResults(20);   
List<User> users = query.getResultList();