2013-03-19 3 views
4

"name + surname"문자열을 키로 사용하여 "customers"테이블을 쿼리하려고합니다.연결된 필드의 JPA 쿼리 필터

이름과 성은 다른 필드에 저장됩니다.

그래서 제 질문은 다음과 같습니다

SELECT 
    * 
FROM 
    customers 
WHERE 
    CONCAT(name,' ',surname) LIKE '%term%' 
    OR CONCAT(surname,' ',name) LIKE '%term%' 

그러나, 나는 할 수 없어, 내 쿼리는 JPA2 기준 쿼리입니다. 예 :

CriteriaBuilder cb = getEntityManager().getCriteriaBuilder(); 
      CriteriaQuery cq = cb.createQuery(); 
      Root<Customer> from = cq.from(Customer.class); 
      cq.select(from); 

      Predicate whereClause = cb.or(
       cb.like(from.<String>get("name"), "%"+ r +"%"), 
       cb.like(from.<String>get("surname"), "%"+ r +"%"), 
      ); 

      cq.where(whereClause);  
      TypedQuery<Customer> query = getEntityManager().createQuery(cq); 
      list = query.getResultList(); 

결과 집합을 이름과 성을 조합하여 어떻게 필터링 할 수 있습니까?

답변

13

사용 CriteriaBuilder.concat(Expression, Expression) : 좋아

Expression<String> exp1 = cb.concat(from.<String>get("name"), " "); 
exp1 = cb.concat(exp1, from.<String>get("surname")); 
Expression<String> exp2 = cb.concat(from.<String>get("surname"), " "); 
exp2 = cb.concat(exp2, from.<String>get("name")); 
Predicate whereClause = cb.or(cb.like(exp1, "%"+ r +"%"), cb.like(exp2, "%"+ r +"%")); 
+0

! 고맙습니다!! –