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();