Как мне написать запрос критериев гибернации для суперкласса и проверить наличие определенного подкласса?

Как я могу написать запрос критериев гибернации для суперкласса и проверить наличие определенного подкласса? Давайте представим, что у нас есть следующие классы, все сопоставленные с Hibernate-JPA:

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Bar {
    @Id
    @Column(name = "id")
    private Long id;
}

@Entity
@PrimaryKeyJoinColumn(name="bar_id")
public class Foo extends Bar {
}

@Entity
@PrimaryKeyJoinColumn(name="bar_id")    
public class Goo extends Bar {
}

При написании запроса Criteria, подобного этому, я хотел бы, для производительности, использовать левое соединение с подклассом:

getSession()
    .createCriteria(Bar.class)
    .createAlias("Foo", "foo", CriteriaSpecification.LEFT_JOIN)
    .add(Restrictions.isNotNull("foo.bar_id"))
    .list();

Это не удается, потому что путь ассоциации "Foo" явно не работает, но он будет проиллюстрировать то, что я хочу. Или есть другой способ выполнить этот тип запроса? Мне нужно, чтобы запрос был выполнен в суперклассе. Если бы я сделал это в SQL, он бы выглядел так:

select b.*
from bar b left join foo f on f.bar_id = b.id
where f.bar_id is not null;

SQL-запрос выше просто чтобы проиллюстрировать, что я имею в виду, я знаю, что в этом конкретном случае было бы проще использовать «обычное» соединение.

6
задан crunchdog 2 July 2011 в 12:18
поделиться