Utiliser moins de colonnes sur requête SQL via Hibernate Projections sur l'Entité de relation ManyToOne
Je suis en train de construire une petite SQL, pour éviter le "select * from" qui est en train de construire par défaut pour hibernate Critères.
Si j'utilise des champs simples (aucun rapport), par le biais de "Transformers", j'ai peut gérer à avoir ce SQL:
select description, weight from Dog;
Salut, j'ai cette Entité:
@Entity
public class Dog
{
Long id;
String description;
Double weight;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "person_id", nullable = false)
Person owner;
}
@Entity
public class Person
{
Long id;
String name;
Double height;
Date birthDate;
}
Mon objectif est de faire ceci:
select description, weight, owner.name from Dog
J'ai essayé cela avec avec des Critères et sous-critères):
Criteria dogCriteria = sess.createCriteria(Dog.class);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("description"), description);
proList.add(Projections.property("weight"), weigth);
dogCriteria.setProjection(proList);
Criteria personCriteria = dogCriteria.createCriteria("owner");
ProjectionList ownerProList = Projections.projectionList();
ownerProList.add(Projections.property("name"), description);
dogCriteria.setProjection(ownerProList); //After this line, debugger shows that the
//projection on dogCriteria gets overriden
//and the query fails, because "name" is
//not a field of Dog entity.
Comment dois-je utiliser les Projections, pour obtenir une plus petite SQL, moins de colonnes ?
Merci à l'avance.
OriginalL'auteur Awi | 2009-10-24
Vous devez vous connecter pour publier un commentaire.
Tout d'abord,
n'est pas valide SQL. Il devrait être quelque chose comme
à la place. Deuxièmement, pourquoi? Alors qu'il est possible de faire ce que vous voulez (voir ci-dessous), il est extrêmement détaillé de le faire via l'API des Critères et vous ne gagnez rien à montrer pour elle. Des économies sur le transfert de données pour un couple de colonnes sont négligeables, sauf si les colonnes sont énormes gouttes ou vous êtes à la sélection des centaines de milliers d'enregistrements. Dans les deux cas, il ya de meilleures façons de traiter ce problème.
Anywho, à faire ce que vous voulez pour les critères, vous devez rejoindre la table liée (Personne) par l'intermédiaire d'alias et de spécifier la projection sur principal critères d'utilisation de l'alias:
Il y a une description et un exemple de la Les critères de Projections de la documentation. Gardez à l'esprit que, lorsqu'il est exécuté, les critères ci-dessus doit retourner une liste de tableaux d'objets. Vous aurez besoin de spécifier un ResultTransformer afin d'avoir des résultats convertis en objets réels.
OriginalL'auteur ChssPly76
Je n'ai pas encore essayé par moi-même, mais je pense que vous pouvez également utiliser un autre constructeur de votre Entité (Pojo) et de transmettre les colonnes.
Voir https://www.thoughts-on-java.org/hibernate-best-practices/ chapitre "1.2 Pojo" pour des instructions détaillées.
Bien que pour moi ce n'est pas encore clair si cela fonctionne aussi pour les relations ManyToOne trop. Je vais avoir un essai.
OriginalL'auteur Christian Lischnig