Java 制定JPA标准';在';表情
我请求帮助理解如何使用javax.persistence.criteria包制定“in”条件 我正在为Contacts类创建一个基于搜索条件的CriteriaQuery。一个联系人可以属于0到多种联系人类型。搜索条件可以包括姓氏值、联系人类型或两者 当我尝试这个:Java 制定JPA标准';在';表情,java,jpa-2.0,criteria-api,Java,Jpa 2.0,Criteria Api,我请求帮助理解如何使用javax.persistence.criteria包制定“in”条件 我正在为Contacts类创建一个基于搜索条件的CriteriaQuery。一个联系人可以属于0到多种联系人类型。搜索条件可以包括姓氏值、联系人类型或两者 当我尝试这个: Expression<ContactType> param = criteriaBuilder.parameter(ContactType.class); Expression<List<
Expression<ContactType> param = criteriaBuilder.parameter(ContactType.class);
Expression<List<ContactType>> contactTypes = fromContact.get("contactTypes");
Predicate newPredicate = param.in(this.getContactType(), contactTypes);
Expression param=criteriaBuilder.parameter(ContactType.class);
表达式contactTypes=fromContact.get(“contactTypes”);
谓词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>]
org.apache.openjpa.persistence.ArgumentException:无法执行查询;声明的参数“ParameterExpression”没有给定值。必须按给定顺序为以下每个参数提供值:[ParameterExpression]
我还没有找到一个好的例子来说明如何做到这一点。任何援助和指导都是非常宝贵的。完整代码如下
公共CriteriaQuery getSearchCriteriaQuery(EntityManager EntityManager){
CriteriaBuilder CriteriaBuilder=entityManager.getCriteriaBuilder();
CriteriaQuery-CriteriaQuery=criteriaBuilder.createQuery(Contact.class);
Root-fromContact=criteriaQuery.from(Contact.class);
谓词whereClause=criteriaBuilder.equal(fromContact.get(“域”),this.getDomain();
如果(!StringUtils.isEmpty(this.getLastName())){
谓词newPredicate=criteriaBuilder.equal(fromContact.get(“lastName”),this.getLastName());
whereClause=标准生成器和(whereClause,新谓词);
}
if(this.getContactType()!=null){
表达式参数=criteriaBuilder.parameter(ContactType.class);
表达式contactTypes=fromContact.get(“contactTypes”);
谓词newPredicate=param.in(this.getContactType(),contactTypes);
whereClause=标准生成器和(whereClause,新谓词);
}
返回criteriaQuery.where(where子句);
}
@实体
@表(name=“contact”)
公共类联系人实现可序列化{
私有静态最终长serialVersionUID=-2139645102271977237L;
私人长id;
私有字符串名;
私有字符串lastName;
私有域;
私人列表联系人类型;
公众联络(){
}
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(unique=true,nullable=false)
公共长getId(){
返回此.id;
}
公共无效集合id(长id){
this.id=id;
}
@列(name=“FIRST_name”,长度=20)
公共字符串getFirstName(){
返回这个.firstName;
}
public void setFirstName(字符串firstName){
this.firstName=firstName;
}
@列(name=“LAST_name”,长度=50)
公共字符串getLastName(){
返回this.lastName;
}
public void setLastName(字符串lastName){
this.lastName=lastName;
}
//域的双向多对一关联
@manytone(fetch=FetchType.LAZY)
@JoinColumn(name=“DOMAIN”)
公共域getDomain(){
返回此.domain;
}
公共无效设置域(域){
this.domain=域;
}
@许多
@JoinTable(name=“CONTACT\u CNTTYPE”,
joinColumns={
@JoinColumn(name=“CONTACT”,referencedColumnName=“ID”)},
反向连接列={
@JoinColumn(name=“CONTACT\u TYPE”,referencedColumnName=“ID”)}
公共列表getContactTypes(){
返回此联系人类型;
}
public void设置联系人类型(列出联系人类型){
this.contactTypes=contactTypes;
}
}
列出结果时,您必须为查询设置参数值:
TypedQuery<Entity> q = this.entityManager.createQuery(criteriaQuery);
q.setParameter(ContactType.class, yourContactTypeValueToFilter);
q.getResultList();
是在查询中创建一个参数,以后需要绑定。在列出结果时,必须为查询设置参数值:
TypedQuery<Entity> q = this.entityManager.createQuery(criteriaQuery);
q.setParameter(ContactType.class, yourContactTypeValueToFilter);
q.getResultList();
是在查询中创建一个参数,以后需要绑定。尝试使用子查询尝试使用子查询