Search code examples
javasqlhibernatecriteriaprojection

Hibernate join without createQuery()


How can I achieve this

session
    .createQuery(
        "select person from Pet pet " +
        "inner join pet.person person " +
        "where person.age = 32)
    .list();

by, instead of using HQL, use Hibernate functions such as createCriteria(), createAlias(), setProjection(), etc?


Solution

  • Something like this should work

    Criteria crit = session.createCriteria(Person.class);
    crit.createAlias("pet", "pet");
    crit.add(Restrictions.eq("age", 32);
    crit.list();
    

    createAlias is used only to inner join with Pet, if the point is to list all persons aged 32 which have a pet.

    EDIT After comments about the model and requirements, try this. Not pretty, but it should work

    Criteria c = session.createCriteria(Person.class, "person");
    c.add(Restrictions.eq("age", 32));
    DetachedCriteria dc = DetachedCriteria.forClass(Pet.class, "pet");
    dc.add(Property.forName("pet.person_id").eqProperty("person.id"));
    c.add(Subqueries.exists(dc.setProjection(Projections.id())));
    List<Person> persons = c.list();