Search code examples
javasqlhibernatenamed-query

Hibernate NamedQuery with a condition on inner List


    class A{
// one to many mapping
    List<B> listOfB;
    //getter and setter;
    class B {
    String s;
    //getter and setter
    }

Now, when I get class A , it will return all the associated class Bs in listOfB. But I need certain condition on which of B should be in response. Like Get A such that listOfB contains all such B for which s = 'something'.

EDIT : currently this is not working:

select a from A a where a.listOfB IN (select b from a.listOfB b where b.s='something');

Solution

  • 1) I assume that you mapped a one-to-many relation from A to B like A.listOfB = B.b

    I think your query can be simplified as:

    select a 
    from A a, B b
    where a.listOfB = b.b
    and where b.s='something'
    

    The equivalent Hibernate Criteria query would be:

    List results =  sess.createCriteria(A.class)  
        .createCriteria("listOfB")
        .add(Restrictions.eq("s", "something"))
        .list();
    

    2) If there is no relation mapped between these entities you can use an SQLRestriction over the field a.listOfB

    List results = sess.createCriteria(A.class)
    .add( Restrictions.sqlRestriction("{alias}.listOfB in (selec b from B where b.s = ?)), "something", Hibernate.STRING) )
       .list();
    

    More examples here.