Les critères Hibernate renvoient les commandes en double avec FetchType.EAGER
Considérez le mappage Hibernate suivant :
@OneToMany(targetEntity = OrderTransaction.class, cascade = CascadeType.ALL) public List<OrderTransaction> getOrderTransactions() { return orderTransactions; }
Avec ceci mappage, vous pouvez filtrer les commandes à l'aide de leur champ orderStatus :
public List<Order> getOrderForProduct(OrderFilter orderFilter) { Criteria criteria = getHibernateSession() .createCriteria(Order.class) .add(Restrictions.in("orderStatus", orderFilter.getStatusesToShow())); return criteria.list(); }
Cependant, lorsque le type de récupération est explicitement défini sur EAGER, la liste résultante contient des commandes en double.
La raison pour les doublons
Avec FetchType.EAGER, Hibernate effectue une opération de jointure pour récupérer avec impatience les OrderTransactions associées. En conséquence, chaque commande de la liste résultante sera dupliquée pour chaque OrderTransaction associée. C'est le comportement attendu dans ce scénario.
Obtention de résultats distincts
Pour obtenir des commandes distinctes malgré la récupération rapide, vous pouvez utiliser le code suivant dans votre requête Critères :
Criteria criteria = getHibernateSession() .createCriteria(Order.class, "o") .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
Ressources supplémentaires
Pour plus d'informations sur ce comportement, reportez-vous aux ressources suivantes :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!