Hibernate Criteria collection property (subquery?)

13,037

You're very close to the solution. You just missed the restriction stating than the track must be a track of the CD:

Criteria cdCriteria = session.createCriteria(CD.class, "cd");
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track");
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle"));
trackCriteria.add(Restrictions.propertyEq("track.cd.id", "cd.id"));
trackCriteria.setProjection(Projections.property("track.title"));
criteria.add(Subqueries.exists(trackCriteria));
List<CD> cds = criteria.list();

or

Criteria cdCriteria = session.createCriteria(CD.class, "cd");
DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class, "track");
trackCriteria.add(Restrictions.eq("track.title", "SomeTitle"));
trackCriteria.createAlias("track.cd", "trackCd");
trackCriteria.add(Restrictions.propertyEq("trackCd.id", "cd.id"));
trackCriteria.setProjection(Projections.property("track.title"));
criteria.add(Subqueries.exists(trackCriteria));
List<CD> cds = criteria.list();

You could also avoid the subquery and simply use a join

Criteria cdCriteria = session.createCriteria(CD.class, "cd");
criteria.createAlias("cd.tracks", "track");
criteria.add(Restrictions.eq("track.title", "someTitle"));
criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE);
Share:
13,037
user1119371
Author by

user1119371

Updated on June 16, 2022

Comments

  • user1119371
    user1119371 about 2 years

    I am not very familiar with Hibernate Criteria, and apologize if this question is too simple... However, any help is greatly appreciated!

    I have two entities, CD and Track. Each CD has collection of Track-objects. In each Track there is a String-field named "title". Now I want to retrieve, using Hibernate Criteria all CDs having a Track with "title" set to a certain value. What I have so far is this:

    //session handling
    Criteria cdCriteria = session.createCriteria(CD.class);
    DetachedCriteria trackCriteria = DetachedCriteria.forClass(Track.class);
    trackCriteria.add(Restrictions.eq("title", "SomeTitle"));
    trackCriteria.setProjection(Projections.property("title"));
    criteria.add(Subqueries.exists(trackCriteria));
    List<CD> cds = criteria.list();
    

    This returns all CDs, regardless of track title. Does anybody have any suggestions?

    Thank you in advance.