[英]How to do JPA query with Criteria Clause?
First I want to do a query like 首先我想做一个查询
"select count(*) from Post p where p.tag in (tagArray) "
where tagArray is "'tag1','tag2','tag3'".then I'd like to do a paginate query: 其中tagArray为“'tag1','tag2','tag3'”。然后,我想进行分页查询:
query.setFirstResult(int1).setMaxResult(int2);
I don't know how to write this query. 我不知道如何编写此查询。 I searched the posts ,can't find answers, so can anybody give me any advice?
我搜索了帖子,找不到答案,所以有人可以给我任何建议吗? thanks.
谢谢。
Here's sample code: 这是示例代码:
// get an entity manager
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaManager");
EntityManager em = emf.createEntityManager();
// create query
Query query = em.createQuery("select count(*) from Post p where p.tag in (tagArray)") // use parameters here when necessary
.setFirstResult(int1)
.setMaxResults(int2);
// get result
query.getResultList();
Update: 更新:
If you want to create query by criteria, try this: 如果要按条件创建查询,请尝试以下操作:
CriteriaBuilder builder = em.getCriteriaBuilder(); // em is as the same the the above
CriteriaQuery<Post> query = builder.createQuery(Post.class);
Root<Post> post = query.from(Post.class);
query.select(post).where(post.get("tag").in("tag1", "tag2", "tag3")); // or pass a tag collection to `in` method
TypedQuery<Post> typedQuery = em.createQuery(query);
List<Post> results = typedQuery.setFirstResult(int1).setMaxResults(int2)
.getResultList();
Thank you very much! 非常感谢你! Following your instruction, I've done it like this,a little complicated.
按照您的指示,我已经做到了,有点复杂。
public List<Post> findPostBySitePaged(Set sites, Page page) {
List<Post> result = new ArrayList<Post>();
if (sites == null || sites.size() == 0) return result;
try {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Long> cQuery = builder.createQuery(Long.class);
Root<Post> root = cQuery.from(Post.class);
CriteriaQuery<Long> select = cQuery.select(builder.count(root));
select.where(root.get("site").in(sites));
TypedQuery<Long> typedQuery = em.createQuery(select);
Long t = typedQuery.getSingleResult();
int tot = t.intValue() / page.getPageSize() + ((t.intValue() % page.getPageSize()) == 0 ? 0 : 1);
page.setTotal(tot);
CriteriaQuery<Post> criteriaQuery = builder.createQuery(Post.class);
root = criteriaQuery.from(Post.class);
criteriaQuery.select(root).where(root.get("site").in(sites)).orderBy(builder.desc(root.get("createDate")));
TypedQuery<Post> postQuery = em.createQuery(criteriaQuery);
postQuery.setFirstResult((page.getCurrent() - 1) * (page.getPageSize())).setMaxResults(page.getPageSize());
result = postQuery.getResultList();
} catch (Exception e) {
log.error(e.getMessage());
}
return result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.