Comment effectuer un non-polymorphe requête HQL en veille prolongée?
Je suis en utilisant Hibernate 3.1.1, et en particulier, je suis en utilisant des requêtes HQL.
Selon la la documentation, Hibernate requêtes sont polymorphes:
Une requête comme:
from Cat as cat
retourne les instances non seulement deCat
, mais aussi des sous-classes commeDomesticCat
.
Comment pouvez-j'ai une requête pour les instances de Chat, mais pas de l'un quelconque de ses sous-classes?
J'aimerais être en mesure de le faire sans avoir à mentionner explicitement chaque sous-classe.
Je suis au courant des options suivantes, et ne les trouve pas satisfaisante:
- Manuellement filtrage les instances après la requête, OU:
- Manuellement ajouter une clause where sur la colonne discriminante.
Il serait judicieux d'Hibernation pour permettre à l'utilisateur de décider si une requête doit être polymorphe ou pas, mais je ne trouve pas une telle option.
Merci d'avance!
Vous devez vous connecter pour publier un commentaire.
Utilisation
polymorphism="explicit"
dans le mapping de la classe. Ce sera la cause de requêtes pour retourner uniquement les instances de la classe nommée et non ses sous-classes.isExplicitPolymorphism
méthode sur monEntityPersister
. Vous avez certainement m'a donné un coup de pouce dans la bonne direction.où la valeur
'cat'
est le régulateur de la valeur de laCat
classe.Si vous utilisez
TABLE_PER_CLASS
, puis essayezcat.class='Cat'
) (le nom de la classe)Ce n'est pas exactement une clause where sur la colonne discriminante, car une telle requête échoue (la colonne discriminante est uniquement disponible en natif des requêtes).
JPA 2 (Hibernate 3.5) ajoute le support pour les non-requêtes polymorphiques, c'est très similaire à la mise en veille prolongée .propriété de la classe (comme Bozho répondu ci-dessus), mais il n'est pas spécifique d'Hibernate. Ceci est fait en utilisant le TYPE de l'opérateur. Comme dans
Vous pouvez en lire plus à propos de ici dans mon blog
Eyal
L'ORM imite le Modèle Java: si un objet est une instance d'un autre type (si une instance de PersianCat est une instance de Chat aussi), toute requête sur le Chat devra être polymorphe (imaginez vous l'interrogation d'une Liste et en demandant si les entrées correspondent
instanceof Cat
.Même Bozho de la solution est un peu impur, depuis la colonne "classe" est censé être opaque à votre hibernate mapping, même si j'avoue que ses un très bon compromis. Vous pouvez simplement obtenir le discriminateur par le biais de la classe simple nom.
Si vous êtes confortable et utilisez d'une table par classe vous pouvez toujours faire une requête native pour le Chat de la table pour obtenir les identifiants et puis obtenir les entrées via hibernate.
x instanceof Cat
en Java. Ma question, cependant, est sur les autres 1%, quand il y a une raison pour laquelle vous ne voulez pas charger le sous-type - tout comme l'utilisation dex.getClass() == Cat.class
en Java. Dans mon cas, c'est au système de bootstrap, quand je ne peux pas encore instancier sous-type des objets.Regarder BaseQueryReturnFieldsCalculatorGc; il ajoute dynamiquement une condition pour le " où "qui sélectionne uniquement où class=XXX; vous pouvez dupliquer ce logique pour la HQLQueryTemplate et demandez à l'utilisateur de définir le terme "isNonPolymorphic'.
Noter qu'il ne fonctionne qu'avec la table par hiérarchie, cos n'est qu'implicite colonne classe existe et est sélectionnable.