java - 如何对 JPA 查询进行分页

标签 java jpa orm pagination criteria

我有一个提交表,其中包含 IDNameCode 等列以及其他属性。我的要求是根据上述属性搜索记录并返回分页集。

这是我正在寻找的伪代码:

searchSubmission(searchFilter sf,pageIndex,noOfRecords) {
   query = 'from submisssion where code=sf.code or id=sf.id order by id start_from (pageIndex*noOfRecords) limit noOfRecords'
   return result();
}

CriteriaBuilderNamedQuery 等似乎有很多选择。在这种情况下,哪个是最有效的?

最佳答案

对于所有 JPA 查询对象( native SQL 查询除外),您可以通过 setMaxResults(int) 和 setFirstResult(int) 方法使用分页。例如:

  return em.createNamedQuery("yourqueryname", YourEntity.class)
      .setMaxResults(noOfRecords)
      .setFirstResult(pageIndex * noOfRecords)
      .getResultList();

JPA 将为您执行分页。

命名查询只是预定义的,可以缓存,而其他类型是动态创建的。
所以选择是像这样使用 JPQL:

Query query = em.createQuery("SELECT s FROM Submission s WHERE s.code = :code or s.id = :id ORDER BY s.id", Submission.class);

或 CriteriaBuilder api 形成类似的查询:

    CriteriaBuilder qb = em.getCriteriaBuilder();
    CriteriaQuery<Submission> cq = qb.createQuery(Submission.class);

    Root<Submission> root = cq.from(Submission.class);
    cq.where( qb.or( 
        qb.equal(root.get("code"), qb.parameter(String.class, "code")),
        qb.equal(root.get("id"), qb.parameter(Integer.class, "id"))
    ));
    Query query = em.createQuery(cq);

例如,不要忘记使用 query.setParameter("id", sf.id) 设置参数值。

关于java - 如何对 JPA 查询进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16088949/

相关文章:

database - 使用多个数据库和 Liquibase 时的最佳 Hibernate 主键生成类型

hibernate - 在 tomcat 中创建名称为 'dataSource' 的 bean 时出错

python - django 中关系的平均值

java - 在 JPA 环境中声明 Hibernate 事件监听器

java - 如何根据成员对象的字段值而不是成员对象ID获取实体

java - 如何使用 JPA 将一个表与另一个查找表映射?

java - 执行 Kettle 转换

java - 将括号转换为链接 Java

java - 如何使用BAPI在SAP系统中重置密码?

java - 检查数组列表中的空字段