2013-01-05 2 views
-1

먼저 내가 좋아하는 쿼리를 수행 할기준 절을 사용하여 JPA 쿼리를 수행하는 방법은 무엇입니까?

"select count(*) from Post p where p.tag in (tagArray) " 
tagArray는 " '이 tag1', 'tag2로', 'TAG3'"그때는 PAGINATE 쿼리 할 싶습니다이다

:.

query.setFirstResult(int1).setMaxResult(int2); 

이 쿼리를 작성하는 방법을 모르겠습니다. 게시물을 검색 했으므로 답변을 찾을 수 없으므로 아무에게도 조언을 줄 수 있습니까? 감사.

답변

0

대단히 감사합니다! 당신의 지시에 따라, 나는 이것을 조금 복잡하게했습니다.

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; 
} 
2

다음은 샘플 코드입니다 :

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

업데이트 : 당신이 기준에 따라 쿼리를 만들려면

,이 시도 :

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(); 
+0

감사합니다.하지만 Criteria 클래스와 IN 절을 사용하고 싶습니다. – sitexa

+0

답을 업데이트했습니다. –

관련 문제