Критерий подзапроса с ненулевым - PullRequest
9 голосов
/ 05 декабря 2011

Я хочу преобразовать следующий подзапрос для использования подзапроса hibernate:

getCurrentSession().createQuery("from Employee where id in (select adminId from Department where adminId is not null)")
                   .list();
  • Сотрудник:

    @ManyToOne
    @JoinColumn(name = "fk_department_id", nullable = true) 
    private Department department;
    
  • Отдел:

    @OneToMany(fetch = FetchType.EAGER)
    @JoinColumn(name = "fk_department_id")
    private Set<Employee> employees = new HashSet<Employee>(0);
    

Может ли кто-нибудь предоставить мне пример этого преобразования, потому что я прочитал несколько примеров и до сих пор не могу понять, как это сделать.

1 Ответ

20 голосов
/ 05 декабря 2011
Criteria c = session.createCriteria(Employee.class, "e");
DetachedCriteria dc = DetachedCriteria.forClass(Departemt.class, "d");
dc.add(Restrictions.isNotNull("d.adminId");
dc.setProjection(Projections.property("d.adminId"));
c.add(Subqueries.propertyIn("e.id", dc));

Вызов setProjection заставляет подзапрос возвращать свойство adminId только вместо всей сущности Department. Subqueries.propertyIn создает ограничение: свойство id искомого сотрудника должно быть in набором результатов, возвращаемых подзапросом.

...