Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate Criteria for "in subselect"

I'm trying to do something like this, but using Criteria instead of HQL:

select user from User where user in (
    select user from UserDomain where domain.id = "XXX"
)

User being an entity having a one-to-many relationship to the join table UserDomain. The point here is simply to find Users that are linked to a Domain having id = "XXX".

This seems like it should be very simple... but I'm having no luck so far turning up any useful docs.

like image 416
Marc Avatar asked Dec 06 '13 14:12

Marc


3 Answers

The subquery is very useful in cases, that you need to search the User, having one-to-many UserDomains. In that case, the WHERE UserId IN (subquery) brings big advanatage: we are still working with a flat User table/entity... so we can do the proper paging.

Here is the documentation 15.8. Detached queries and subqueries

The draft could be: subquery:

DetachedCriteria userSubquery = DetachedCriteria.forClass(UserDomain.class, "ud")
    // Filter the Subquery
    .add(Restrictions.eq(UserDomain.DOMAIN, domain))
    // SELECT The User Id  
    .setProjection( Projections.property("ud.userId") );

And the main query:

Criteria query = session.createCriteria(User.class, "u")
    .add( Subqueries.propertyIn("u.id", userSubquery) );

Now we have a query, which could be used for paging

like image 100
Radim Köhler Avatar answered Nov 05 '22 06:11

Radim Köhler


In clauses usualy can be transformed into join. Tyr this:

Criteria c = session.createCriteria(User.class, "u");
c.createAlias("u.userDomain", "ud"); // inner join by default
c.add(Restrictions.le("ud.id", 1));
like image 25
Evgeni Dimitrov Avatar answered Nov 05 '22 07:11

Evgeni Dimitrov


I finally found it. Turns out it wasn't so hard after all... once you know!

criteria = criteria.createCriteria(User.USER_DOMAINS).add(Restrictions.eq(UserDomain.DOMAIN, domain));

Yep, there is was, staring me right in the face in the Javadoc: http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/Criteria.html

like image 3
Marc Avatar answered Nov 05 '22 06:11

Marc