Java 制定JPA标准';在';表情

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<

我请求帮助理解如何使用javax.persistence.criteria包制定“in”条件

我正在为Contacts类创建一个基于搜索条件的CriteriaQuery。一个联系人可以属于0到多种联系人类型。搜索条件可以包括姓氏值、联系人类型或两者

当我尝试这个:

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();
是在查询中创建一个参数,以后需要绑定。

尝试使用子查询尝试使用子查询