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