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;
}
}
하위 쿼리 사용을 시도하십시오. http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html#querycriteria-detachedqueries –