Ajouter un Groupe à un Hibernate Critères de la Requête, sans Projection
J'ai des Critères de Requête, qui rejoint un deuxième tableau B, pour sélectionner les entités à partir de la table A. Le problème, c'est que cette requête retourne des entités à partir d'Une table à plusieurs reprises. Mais j'ai besoin des résultats distincts.
À L'Aide De Critères.DISTINCT_ROOT_ENTITY est inutile, becaus ce filtre multiples occurences après le SQL de la Requête a été exécutée. Donc, quand je limite mes résultats à 20 coups, je me retrouve avec seulement 4, mais il y a plus d'entrées, qui correspondent à ma requête.
En pur SQL j'ai simplement ajouter un "GROUP BY ID" de la requête et de tout ce qui est bien, parce que la jointure de la table B est uniquement utilisé, pour sélectionner les entités à partir de la table A. Mais avec les Critères de l'API je ne peux pas faire cela. La seule façon d'ajouter un "GROUPE" est à l'aide de Projections. Mais ensuite, je me retrouve avec des valeurs scalaires, pas avec une véritable instance de ma classe. À l'aide d'un SQL-restriction ne fonctionne pas non plus, parce que hibernate ajoute un bogous "1=" 1 " après mon "GROUPE"de la clause. 🙁
Des idées?
GROUP BY
, par définition, implique l'agrégation des données, c'est pourquoi les Projections sont nécessaires. Peut-être que si vous avez ajouté plus de détails sur les tables, et la requête SQL que vous voulez Hibernate pour générer, nous pourrions vous conseiller au mieux.J'ai une classe de l'Événement. Cette classe a une Liste de Dates. (En fait, ces Dates sont une classe spéciale DateWrapper, qui encapsule la Date et ajoute un Id, parce que hibernate ne peut pas joindre de type de valeur des collections pour le moment). Je voudrais interroger les événements et trouver tous les événements avec un ou plusieurs événements entre x et y. Quand je grap le SQL de la Requête, qui a été générée par les Critères de l'API, et ajouter un "GROUP BY id", c'est exactement, ce que je suis à la recherche d'. Mais je ne trouve aucun moyen d'argumenter Hibernate en ajoutant le GROUPE!
OriginalL'auteur Kai Moritz | 2010-01-09
Vous devez vous connecter pour publier un commentaire.
Avez-vous essayé d'utiliser quelque chose comme ceci?
Vous pouvez ajouter dynamiquement des propriétés de réflexion de la classe.
Cela crée SQl comme ceci:
select distinct prop1,prop2,prop3,prop4 from yourClass
Je n'ai pas
DetachedCriteria dc
puisque c'est hors de propos.OriginalL'auteur user748954
GROUPE SANS PROJECTION: ce n'est pas possible comme il sens, dans de nombreuses réponses, vous pouvez trouvé, Mais la plupart des gens ne veulent pas utiliser la projection, car il nécessite à chaque projet et chaque attribut, mais l'exigence est qu'un bean doit être projetée. (et retournée comme résultat). Dans l'exemple ci-dessous, j'ai essayé de
project
le nécessairebean
comme résultante de l'objet.J'ai obtenu le même résultat avec un peu de truc je crois, j'ai d'Abord été tenté de faire le groupe sans projection, mais j'ai pas trouvé de solution, donc je dois me fier sur la Projection.
Ici est ce que je voulais obtenir
Dans du code Java je voulais
p.*
être unParent
classe qui est mon entity bean et je voulais être unique, une façon est d'obtenir la liste des résultats dans un Ensemble, mais je n'aime pas cette façon en raison de nombreuses raisons 🙂J'ai donc créé un des Critères de
Child.class
au lieu deParent.class
, et cette astuce a fonctionné pour moi.Si vous n'avez pas encore eu l'idée voici mon mappé Bean Entity classes.
et mon enfant de la classe
OriginalL'auteur
Il est possible d'écrire réel les Requêtes SQL qui Hibernate peut utiliser pour renvoyer des entités. Donc, si vous en avez vraiment besoin, vous pouvez ignorer les requêtes HQL et écrire exactement la requête que vous voulez avec votre GROUPE PAR.
Voir ici pour plus de détails.
Par exemple, vous pouvez définir une requête à quelque chose comme ceci dans votre hbm.xml fichier:
Note {x.} et {y.} abréviation de syntaxe pour sélectionner toutes les propriétés de l'entité X et entité Y
Il est aussi possible de spécifier un natif SQL de la requête par programme plutôt que comme une requête nommée comme indiqué ci-dessus, si ce n'est en utilisant les critères de l'API.
OriginalL'auteur alasdairg
Le principal problème de regroupement sans que la projection, dans la manière que vous voulez, c'est que dans certains SGBD comme Oracle, il ne fonctionnera pas, l'Oracle renvoie une erreur.
Si vous le groupe a choisir, vous devez regrouper par tous les non-agrégation de champs que vous sélectionnez. La base de données MySQL par exemple n'ont pas cette restriction.
L'approche que j'ai utilisé est de sélectionner uniquement l'id comme groupProperty de projection avec tous les filtres, les achats et le nombre de résultats de la limite. Puis une exécuter une autre requête de filtrage avec ces récupéré les id. De cette façon, la mise en œuvre sera indépendant du SGBD.
OriginalL'auteur Renato Oliveira