2017-08-03 7 views
0

Pourquoi les critères de requête ne filtre pas les enregistrements en fonction services (entités de collecte) état services.get ("statut"), "en attente") comme ci-dessous?JPA collections de filtres basés sur la condition

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

où que SQL ne les enregistrements de filtre correctement

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

dossiers sans aucune qualification resultset fondée sur la condition d'état (pour la collecte), en fait, tous les services d'un client ont été retournés.

J'ai essayé de, utilisez l'outil d'inscription (car il y avait 2 requêtes exécutées 1er pour le client et 2ème pour les services de ce client, la pensée condition peut être pas été évaluée dans 2 requête) en utilisant

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

mais pas de chance.

Je suis surpris par ce comportement. J'utilise fournisseur OpenJPA JPA

Les entités sont client et service .

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 Pourriez-vous s'il vous plaît jeter un oeil à ce problème? Merci –

Répondre

0

Essayez ce code, le changement est que je l'ai fait j'ai ajouté la sécurité de type au query.Know sur le type de sécurité 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

J'ai essayé de cette façon mais pas de chance. :( –