29

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

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

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();
}

似乎有很多选项,例如CriteriaBuilder,NamedQuery等。在这种情况下,哪个是最有效的选项?

4

3 回答 3

50

对于所有 JPA 查询对象(本地 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) 设置参数值。

于 2013-04-18T18:55:46.073 回答
14

您可以Pageable在存储库方法中使用Spring

@Repository
public interface StateRepository extends JpaRepository<State, Serializable> {

@Query("select state from State state where state.stateId.stateCode = ?1")
public State findStateByCode(String code, Pageable pageable);

}

而在服务层,你可以创建Pageable对象:

@Autowire
StateRepository stateRepository;

public State findStateServiceByCode(String code, int page, int size) {
    Pageable pageable = new PageRequest(page, size);
    Page<Order> statePage = stateRepository.findStateByCode(code, pageable);
    return statePage.getContent();
}
于 2018-01-09T00:47:29.120 回答
6

您可以将 JPA 分页用于实体查询和本机 SQL。

为了限制底层查询ResultSet大小,JPAQuery接口提供了该setMaxResults方法。

浏览下一页需要将结果集定位到最后一页结束的位置。为此,JPAQuery接口提供了该setFirstResult方法。

将分页与 JPQL 查询结合使用如下所示:

List<Post> posts = entityManager.createQuery("""
    select p
    from Post p
    order by p.createdOn
    """)
    .setFirstResult(10)
    .setMaxResults(10)
    .getResultList();

Criteria API 是一样的,因为你需要QueryCriteriaQuery:

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

Root<Post> root = cq.from(Post.class);
cq.orderBy(qb.asc(root.get("createdOn")));

List<Post> posts = em.createQuery(cq)
    .setFirstResult(10)
    .setMaxResults(10)
    .getResultList();
于 2018-10-09T15:47:19.907 回答