8

chcę przekonwertować następujące podkwerenda używać hibernacji podzapytania:Kryteria podzapytanie z nie pustym

getCurrentSession().createQuery("from Employee where id in (select adminId from Department where adminId is not null)") 
        .list(); 
  • Pracownik:

    @ManyToOne 
    @JoinColumn(name = "fk_department_id", nullable = true) 
    private Department department; 
    
  • Dział:

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

Czy ktoś może podać mi przykład tego przelicznika, ponieważ przeczytałem kilka przykładów i nadal nie mogę wymyślić, jak to zrobić.

+0

BTW, mam poważny problem w związku z korektą dowolnego bloku kodu podczas wysyłania nowego pytania, robię to, co zwykle, kopiuję kod z mojego IDE lub z pliku tekstowego i podświetlam kod, a następnie otacza go przycisk kodu, ale źle się wyświetla. –

+0

Dzieje się tak, ponieważ używasz kart zamiast spacji. –

+0

czy możesz mi powiedzieć, jak udało Ci się sformatować kod, więc mogę tego uniknąć w przyszłości? –

Odpowiedz

19
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 połączeń sprawia, że ​​podzapytanie zwróci własność adminId tylko zamiast całego Department podmiotu. Subqueries.propertyIn tworzy ograniczenie: właściwość id wyszukiwanego pracownika musi być in zbiorem wyników zwróconych przez podzapytanie.

+0

działa dobrze, dziękuję, ale czy możesz podać małe wyjaśnienie dla dwóch ostatnich linii, nie mogłem znaleźć dokumentu dla nich. –

+0

Gotowe. Zobacz moje zmiany. –