2009-09-11 6 views
4

J'ai un problème pour créer des sous-requêtes avec Hibernate. Malheureusement, la classe des sous-requêtes est presque entièrement sans papier, donc je n'ai absolument aucune idée de la façon de convertir l'instruction SQL suivante dans un des critères Hibernate:Sous-requête Hibernate

SELECT id 
FROM car_parts 
WHERE car_id IN (SELECT id FROM cars WHERE owner_id = 123) 

J'espérais que le suivant serait « travailler juste »:

session.createCriteria(CarParts.class).add(eq("car.owner", myCarOwner)); 

mais malheureusement pas. Il semble donc que je doive utiliser la classe Subqueries pour créer les critères. Mais je n'ai pas réussi à trouver un exemple raisonnable avec Google, ce qui m'amène à le demander ici.

Répondre

5

Essayez de créer un alias pour la propriété « car » avant d'ajouter l'expression eq comme ceci:

session.createCriteria(CarParts.class) 
     .createAlias("car", "c") 
     .add(eq("c.owner", myCarOwner)); 
0

Comme vérifiez d'abord la configuration ORM entre les entités automobiles et carpart, généralement vous avez besoin de la configuration de la relation entre leur. Après cela, essayez d'exécuter le code suivant:

List result = session.createQuery("from " + CarPart.class.getName() + 
    " as parts join parts.car as car where car.owner = :myOwner") 
    .setParameter("myOwner", 123) 
    .list(); 
7

Essayez Comme ceci:

détails de table): Catégorie (id, nom, desc, parentId, actif)

DetachedCriteria subCriteria = DetachedCriteria 
      .forClass(Category.class); 
    subCriteria.add(Restrictions.isNull("parent")); 
    subCriteria.add(Restrictions.eq("active", Boolean.TRUE)); 
    subCriteria.add(Restrictions.eq("name", categoryName)); 
    subCriteria.setProjection(Projections.property("id")); 

    Criteria criteria = getSession().createCriteria(Category.class); 
    criteria.add(Restrictions.eq("active", Boolean.TRUE)); 
    criteria.add(Subqueries.propertyEq("parent", subCriteria)); 

Il générera la requête comme:

sélectionnez * de Catégories this_ où this_.active = 1 et this_.parentId = ( sélectionner this0_ .id comme y0 de catégories this0__ où this0_ .parentId est nulle et this0 _.active = 1 et this0__. name = 'Plan de santé' )

Bonne chance!

-Rohtash Singh

+2

criteria.add (Subqueries.propertyEq ("parent", sous-critères)); Qu'est-ce qu'un parent ici? –