2012-02-23 2 views
3

Je les deux classes (Java Hibernate) suivantes:Hibernate héritage Requêtes (critères)

public class Grupo{ 
      //plain Attributes 
} 

et

public class Salon extends Grupo{ 
      //plain Attributes 
} 

ayant des objets des deux types.

en utilisant la requête des critères suivants:

s.createCriteria(Grupo.class).list(); 

Je reçois tous les objets de type Grupo, qui est Grupo et Salon, comme prévu. Donc, ce que je veux savoir c'est que s'il y a un moyen dans Criteria Query d'obtenir facilement seulement les objets "Grupo" qui ne sont pas des objets "Salon". Je vais m'abstenir d'utiliser des discriminateurs si possible (dans db les deux classes ont leurs propres tables)

Toute aide sera grandement appréciée.

EDIT: Correction de la syntaxe java incorrecte, comment boiteux de moi.

+0

Eh bien merci quand même pour l'aide. Comme il est préférable de ne pas modifier la structure de classe ou le schéma de mappage, la solution consiste à supprimer manuellement les instances de salon à l'aide de "instanceof", la quantité d'objets ne sera jamais trop importante et le temps de calcul sera toujours linéaire. donc je pense que cela n'aura pas d'impact sur la performance. Cependant, il est triste qu'hibernate n'ait aucun moyen de le faire directement car je ne pense pas que l'utilisation de discriminateurs est la bonne façon car elle utilise une solution de contournement sql au lieu de l'abstraction OOP Hibernate fournit généralement –

Répondre

2

Le problème conceptuel est que tous les objets Salon sont des Grupos.

Pourriez-vous changer Salon afin qu'il ne dérive pas de Grupo et à la place Grupo et Salon partagent une classe de base?

Sinon, vous devrez utiliser des discriminateurs.

+0

+1 pour l'approche de classe de base partagée (bien que Je ne comprends pas vraiment ce que Grupo et Salon sont). – buritos

2

Si vous ne disposez pas d'utiliser des critères alors vous pouvez le faire avec hql

s.createQuery("select g from Grupo g where g.class = Grupo").list(); 

Pour autant que je sache, avec les critères que vous devez avoir une colonne discriminante pour que cela fonctionne.

s.createCriteria(Grupo.class).add(Restrictions.eq("class", "G").list(); 

si votre valeur discriminante pour Grupos est G.

L'approche de classe de base commune proposée par Robinson @ Mark également à considérer ...

+0

Je peux référencer le type de classe de HQL? Cool! Est-ce standard JPQL? –

+0

@ MarkRobinson: J'en doute. En JPA, vous pouvez utiliser TYPE – buritos

+0

Cette approche n'a pas fonctionné pour moi –