2011-10-24 6 views
1

스택 오버플로 주위를 파킹 한 후 문제점을 계산할 때 다음과 같은 솔루션을 발견했습니다. 내 요구 사항은 일치하는 행의 총 수를 얻고 페이지 매김 목적으로 처음 10 개를 반환하는 것입니다. org.hibernate.hql.ast.QuerySyntaxException :JPA 및 잘못된 경로 계산

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<T> cq = cb.createQuery(clazz); 
CriteriaQuery<Long> counterCq = cb.createQuery(Long.class); 
counterCq.select(cb.count(counterCq.from(clazz))); 
Predicate predicate= null; 
Predicate predicate1 = null; 
Root<T> root = cq.from(clazz); 
for (Map.Entry<String, String> e : filters.entrySet()){ 
    predicate = cb.and(cb.like(root.<String>get(e.getKey()), e.getValue()+ "%")); 
} 
if(predicate != null){ 
    cq.where(predicate); 
    counterCq.where(predicate); 
} 
int pn = (em.createQuery(counterCq).getSingleResult()).intValue(); 
logger.debug("number of pages is {}", pn); 
setRowCount(pn); 

if(sortField !=null && !sortField.trim().equals("")){ 
    if(sortOrder == SortOrder.DESCENDING){ 
     cq.orderBy(cb.desc(root.get(sortField))); 
    } else{ 
     cq.orderBy(cb.asc(root.get(sortField))); 
    } 
} 

Query q = em.createQuery(cq); 
q.setFirstResult(first); 
q.setMaxResults(first+ps); 
List<T> cats= (List<T>)q.getResultList(); 

이 조각은

java.lang.IllegalArgumentException가를 통해 할 최대 절전 모드로 만드는 잘못된 경로를 'generatedAlias1.title'[SELECT COUNT (generatedAlias0)에서 미디어 generatedAlias0 generatedAlias1.title like : param0]

다른 검색어로는 cq.from(clazz)을 사용할 수 없습니다. 내 질문 : 두 쿼리에서 동일한 조건자를 사용하는 방법이 있습니까?

답변

3

조건부 목록이 올바르게 조립되지 않았습니다. '및'술어를 하나의 표현식으로 함께 사용해야합니다. 또한 더 나은 가독성을 위해 선택을 수행하기 전에 내 조건자를 작성하는 것을 선호합니다.

CriteriaBuilder cb = em.getCriteriaBuilder(); 
CriteriaQuery<T> cq = cb.createQuery(clazz); 
Root<T> root = cq.from(clazz); 

// build predicate list - conjuction starts us with an empty 'and' predicate 
Predicate predicate = cb.conjunction(); 
for (Map.Entry<String, String> e : filters.entrySet()) { 
    predicate = cb.and(predicate, cb.like(root.get(e.getKey()), e.getValue() + "%")); 
} 

// query total count 
CriteriaQuery<Long> counterCq = cb.createQuery(Long.class); 
counterCq.select(cb.count(root)).where(predicate); 

int pn = (em.createQuery(counterCq).getSingleResult()).intValue(); 
logger.debug("number of pages is {}", pn); 
setRowCount(pn); 

// query results 
cq.select(root).where(predicate); 

if(sortField !=null && !sortField.trim().equals("")) { 
    if(sortOrder == SortOrder.DESCENDING) { 
     cq.orderBy(cb.desc(root.get(sortField))); 
    } 
    else { 
     cq.orderBy(cb.asc(root.get(sortField))); 
    } 
} 

TypedQuery<T> q = em.createQuery(cq); 
q.setFirstResult(first); 
q.setMaxResults(first+ps); 
List<T> list = q.getResultList(); 
: 여기

정확한 결과를 얻기 위해 코드의 리팩토링이다