Tap*_*dra 17 java orm pagination jpa criteria
我有样柱提交表格ID,Name,Code等性质.我的要求是根据提到的属性搜索记录并返回一个分页集.
这是我正在寻找的伪代码:
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();
}
Run Code Online (Sandbox Code Playgroud)
似乎有许多选项,例如CriteriaBuilder,NamedQuery等等.在这种情况下哪个是最有效的?
Chr*_*ris 36
对于所有JPA查询对象(本机SQL查询除外),您将通过setMaxResults(int)和setFirstResult(int)方法使用分页.例如:
return em.createNamedQuery("yourqueryname", YourEntity.class)
.setMaxResults(noOfRecords)
.setFirstResult(pageIndex * noOfRecords)
.getResultList();
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
或者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);
Run Code Online (Sandbox Code Playgroud)
例如,不要忘记使用query.setParameter("id",sf.id)设置参数值.
sen*_*982 12
您可以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);
Run Code Online (Sandbox Code Playgroud)
}
在服务层,你可以创建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();
}
Run Code Online (Sandbox Code Playgroud)
您可以将 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();
Run Code Online (Sandbox Code Playgroud)
Criteria API 是一样的,因为您需要Query从以下内容创建一个CriteriaQuery:
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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
27454 次 |
| 最近记录: |