2011-10-04 3 views
0

J'ai un mappage d'hibernation avec des types de collection personnalisés.Requête Hibernate sur la collection personnalisée

java:

class Policy { 
... 
private HistoryMap<Date, PolicyStatus> statusHistory; 
... 
} 

hbm.xml:

<map name="statusHistory" inverse="true" table="tbl_policy_in_time" order-by="PolIt_ValidFrom desc" 
        collection-type="be.pensionarchitects.admindb.infrastructure.hibernate.HistoryMapType"> 
       ... 
    </map> 

HistoryMapType est une implémentation de l'interface HistoryMap et met en œuvre UserCollectionType. Cette carte a une méthode getCurrent() qui renvoie le PolicyStatus actuel.

Maintenant, j'ai besoin de faire une requête pour obtenir tous les objets de politique ayant un PolicyStatus spécifique en cours.

Quelque chose comme:

Criteria crit = getSession().createCriteria(Policy.class) 
       .createAlias("statusHistory.current", "status") 
       .add(Restrictions.or(
         Restrictions.eq("status.code", "active"), 
         Restrictions.eq("status.code", "sleeper"))); 

Je comprends que cela ne fonctionne pas comme « courant » n'est pas un mappage d'association. Comment devrais-je résoudre ça? J'ai lu que je devrais utiliser HQL à la place, mais je n'ai aucune idée de comment et si c'est possible.

Tous les pointeurs sont appréciés!

Merci

Répondre

1

Si votre HistoryMap implémente java.util.Map (et respecte les contrats de l'interface), vous pouvez utiliser l'API de critères. Sinon, je ne pense pas que cela fonctionnera avec HQL (et avec l'API Criteria). Dans ce cas, l'utilisation de SQL natif est votre meilleur choix. Vous pouvez créer une requête native dont le résultat est marshaleld à un haricot Hibernate spécifique:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querysql.html#d0e13696

Questions connexes