Java JPA标准基于条件筛选集合
为什么条件查询不根据服务(收集实体)条件服务过滤记录。获取(“状态”),“待处理”)如下所示Java JPA标准基于条件筛选集合,java,oracle,jpa,criteria,openjpa,Java,Oracle,Jpa,Criteria,Openjpa,为什么条件查询不根据服务(收集实体)条件服务过滤记录。获取(“状态”),“待处理”)如下所示 CriteriaQuery<Customer> query = cb.createQuery(Customer.class); Root<Customer> customer = query.from(Customer.class); Join<Customer, Service> services = customer.join("services", Jo
CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
Root<Customer> customer = query.from(Customer.class);
Join<Customer, Service> services = customer.join("services", JoinType.INNER);
List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.equal(customer.get("customerId"), 1));
predicates.add(cb.equal(services.get("status"), "pending"));
query.select(customer).distinct(true)
.where(predicates.toArray(new Predicate[]{}));
List<Customer> customers = em.createQuery(query).getResultList();
根据状态条件(用于收集),resultset中的记录不合格,事实上,客户的所有服务都已返回
我尝试使用fetch Join(因为执行了两个查询,第一个是针对客户的查询,第二个是针对该客户的服务的查询,我认为在第二个查询中可能不会评估条件)
但是没有运气
我对这种行为感到惊讶。我正在使用OpenJPA JPA提供程序
实体是客户和服务
public class Customer{
@Id
@Column(name = "ID")
private Integer customerId;
@OneToMany
@MappedBy(name = "customer")
private List<Service> services;
}
public class Service {
@EmbeddedId
private ServicesPK servicePK;
@ManyToOne
@JoinColumn(name = "COID")
private Customer customer;
}
@Embeddable
@EqualsAndHashCode
public class ServicesPK implements Serializable {
@Column(name = "COID")
private Integer coId;
@Column(name = "VERSION")
private Integer version;
}
公共类客户{
@身份证
@列(name=“ID”)
私有整数customerId;
@独身癖
@MappedBy(name=“客户”)
私人名单服务;
}
公务舱服务{
@嵌入ID
私人服务spk servicePK;
@许多酮
@JoinColumn(name=“COID”)
私人客户;
}
@可嵌入
@EqualsAndHashCode
公共类ServicesPK实现可序列化{
@列(name=“COID”)
私有整数coId;
@列(name=“VERSION”)
私有整数版本;
}
试试这段代码,我所做的更改是在查询中添加了类型安全。了解类型安全
CriteriaQuery=cb.createQuery(Customer.class);
Root customer=query.from(customer.class);
加入服务=客户加入(客户服务);
列表谓词=新的ArrayList();
add(cb.equal(customer.get(“customerId”),1));
add(cb.equal(services.get(Service.status),“pending”);
query.select(客户).distinct(true)
.where(谓词.toArray(新谓词[]{}));
List customers=em.createQuery(query.getResultList();
@wypiprz您能看看这个问题吗?谢谢
customer.fetch("services", JoinType.INNER);
public class Customer{
@Id
@Column(name = "ID")
private Integer customerId;
@OneToMany
@MappedBy(name = "customer")
private List<Service> services;
}
public class Service {
@EmbeddedId
private ServicesPK servicePK;
@ManyToOne
@JoinColumn(name = "COID")
private Customer customer;
}
@Embeddable
@EqualsAndHashCode
public class ServicesPK implements Serializable {
@Column(name = "COID")
private Integer coId;
@Column(name = "VERSION")
private Integer version;
}
CriteriaQuery<Customer> query = cb.createQuery(Customer.class);
Root<Customer> customer = query.from(Customer.class);
Join<Customer, Service> services = customer.join(Customer_.services);
List<Predicate> predicates = new ArrayList<Predicate>();
predicates.add(cb.equal(customer.get("customerId"), 1));
predicates.add(cb.equal(services.get(Service_.status), "pending"));
query.select(customer).distinct(true)
.where(predicates.toArray(new Predicate[]{}));
List<Customer> customers = em.createQuery(query).getResultList();