2017-08-03 273 views
0

基于服务(收藏单位)条件services.get为什么条件查询不过滤的记录(“状态”),“待定”)如下?JPA标准筛选集合

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

,其中作为SQL的功能筛选记录正确

select * from customers c 
    INNER JOIN SERVICES s on s.COID = c.COID 
    where c.ID=1 and 
    s.status='pending'; 

记录是在结果集基于状态条件(收集)没有资格,其实,返回了客户的所有服务。

我试图用fetch连接(因为有客户和2该客户的服务执行的第一个2个查询,认为状态可能会在第二次查询中未评估)使用

customer.fetch("services", JoinType.INNER); 

,但没有运气。

我很惊讶这种行为。我正在使用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; 
} 
+0

@wypieprz能否请你看看这个问题呢?谢谢 –

回答

0

试试这个代码,改变我所做的是我添加类型安全有关的类型安全的query.Know typesafe

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

我已经试过这种方式,但没有运气。 :( –