2012-01-16 3 views
1

javax.persistence.criteria 패키지를 사용하여 'in'조건을 공식화하는 방법에 대한 도움말을 요청합니다.'in'표현식으로 표현하기

연락처 클래스에 대한 기준 검색 기반 CriteriaQuery를 만들고 있습니다. 컨택은 0 ~ 여러 컨택 유형에 속할 수 있습니다. 검색 기준에는 성 값, 연락처 유형 또는 둘 다를 포함 할 수 있습니다.

나는이 때 :

Expression<ContactType> param = criteriaBuilder.parameter(ContactType.class);   
Expression<List<ContactType>> contactTypes = fromContact.get("contactTypes"); 
Predicate newPredicate = param.in(this.getContactType(), contactTypes); 

내가 얻을 :이 작업을 수행하는 방법의 좋은 예를 찾을 수 없어

org.apache.openjpa.persistence.ArgumentException: Cannot execute query; declared parameters "ParameterExpression<ContactType>" were not given values. You must supply a value for each of the following parameters, in the given order: [ParameterExpression<ContactType>] 

. 어떤 assitance와지도는 크게 감사하게된다. 전체 코드는 다음과 같습니다.

public CriteriaQuery<Contact> getSearchCriteriaQuery(EntityManager entityManager) { 
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Contact> criteriaQuery = criteriaBuilder.createQuery(Contact.class); 
    Root<Contact> fromContact = criteriaQuery.from(Contact.class); 
    Predicate whereClause = criteriaBuilder.equal(fromContact.get("domain"), this.getDomain()); 

    if (!StringUtils.isEmpty(this.getLastName())) { 
     Predicate newPredicate = criteriaBuilder.equal(fromContact.get("lastName"), this.getLastName()); 
     whereClause = criteriaBuilder.and(whereClause, newPredicate); 
    } 

    if (this.getContactType() != null) { 
     Expression<ContactType> param = criteriaBuilder.parameter(ContactType.class); 
     Expression<List<ContactType>> contactTypes = fromContact.get("contactTypes"); 
     Predicate newPredicate = param.in(this.getContactType(), contactTypes); 
     whereClause = criteriaBuilder.and(whereClause, newPredicate); 
    } 

    return criteriaQuery.where(whereClause); 
} 

@Entity 
@Table(name = "contact") 
public class Contact implements Serializable { 

    private static final long serialVersionUID = -2139645102271977237L; 
    private Long id; 
    private String firstName; 
    private String lastName; 
    private Domain domain; 
    private List<ContactType> contactTypes; 

    public Contact() { 
    } 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(unique = true, nullable = false) 
    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "FIRST_NAME", length = 20) 
    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @Column(name = "LAST_NAME", length = 50) 
    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    //bi-directional many-to-one association to Domain 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "DOMAIN") 
    public Domain getDomain() { 
     return this.domain; 
    } 

    public void setDomain(Domain domain) { 
     this.domain = domain; 
    } 

    @ManyToMany 
    @JoinTable(name = "CONTACT_CNTTYPE", 
    joinColumns = { 
     @JoinColumn(name = "CONTACT", referencedColumnName = "ID")}, 
    inverseJoinColumns = { 
     @JoinColumn(name = "CONTACT_TYPE", referencedColumnName = "ID")}) 
    public List<ContactType> getContactTypes() { 
     return this.contactTypes; 
    } 

    public void setContactTypes(List<ContactType> contactTypes) { 
     this.contactTypes = contactTypes; 
    } 
} 
+0

하위 쿼리 사용을 시도하십시오. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-detachedqueries –

답변

1

당신은 결과를 나열 할 때 쿼리에 매개 변수 값을 설정해야합니다 :

criteriaBuilder.parameter(ContactType.class); 

이 무엇

TypedQuery<Entity> q = this.entityManager.createQuery(criteriaQuery); 
q.setParameter(ContactType.class, yourContactTypeValueToFilter); 
q.getResultList(); 

, 즉, 쿼리에 매개 변수를 만드는 것입니다 나중에 바인딩해야합니다.

관련 문제