Maison  >  Article  >  Java  >  Pourquoi les critères Hibernate renvoient-ils les commandes en double avec FetchType.EAGER ?

Pourquoi les critères Hibernate renvoient-ils les commandes en double avec FetchType.EAGER ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-26 01:40:28659parcourir

Why Does Hibernate Criteria Return Duplicate Orders with FetchType.EAGER?

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 :

  • [FAQ Hibernate sur Distinct Résultats de la récupération des jointures externes](https://docs.jboss.org/hibernate/orm/5.3/javadocs/faq/FAQ.html#ch02s01)
  • [Explication de Gavin King sur les jointures externes SQL et le comportement d'Hibernate ](http://www.hibernate.org/42.html)

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn