2016-12-02 10 views
12

Mam tabeli sql A z nazwami kolumnSub-Select w kryteriach stan hibernacji

name, id1, id2, val1 

i tabela B z nazwami kolumn

id1, id2, key1, key2 

a to mój zapytań SQL

SELECT 
    v1.id1, 
    v1.id2 
FROM (
     SELECT 
     A.id1, 
     A.id2, 
     min(val1) AS x 
     FROM A 
     JOIN B ON A.id1 = B.id1 AND A.id2 = B.id2 
     GROUP BY A.id1, A.id2 
    ) AS v1 
WHERE v1.x > 10 

przy użyciu obiektu DetachedCriteria i udało się utworzyć pod-zapytanie

DetachedCriteria subCriteria = DetachedCriteria.forClass(A_model.class); 
subCriteria.createAlias("b", "b_model"); 
subCriteria.setProjection(Projections.projectionList() 
          .add(Projections.groupProperty("id1")) 
.add(Projections.groupProperty("id2")) 
.add(Projections.min("val1"),"x"); 

, ale mam trudny czas w tworzeniu zewnętrznego zapytania.

Jakąkolwiek sugestię, w jaki sposób mogę utworzyć kryteria dla powyższego kodu SQL?

Dzięki w oczekiwaniu.

+1

Kwerendy kryteriów działają na jednostkach, a nie w tabelach. Nie mamy pojęcia, jak wyglądają te istoty. –

+1

@JBNizet Podałem kolumny dla obu tabel i sql, które chcę. potrzebujesz więcej informacji poza tym. czy możesz zasugerować ogólne rozwiązanie dla sub-selekcji poprzez kryteria? (Możesz założyć dowolną odpowiednią strukturę encji) – sumit

Odpowiedz

1

Wybór z Wybierz nie jest obsługiwany przez obiekt HQL ani obiekt Kryteria. Rozwiązaniem tutaj będzie Named Query.

@NamedNativeQueries({ 
    @NamedNativeQuery(
    name = "findV1", 
    query = "SELECT 
       v1.id1, 
       v1.id2 
      FROM (
        SELECT 
        A.id1, 
        A.id2, 
        min(val1) AS x 
        FROM A 
        JOIN B ON A.id1 = B.id1 AND A.id2 = B.id2 
        GROUP BY A.id1, A.id2 
       ) AS v1 
      WHERE v1.x > 10" 
    ) 
}) 
2

rozważyć utworzenie widoku dla danych trzeba:

create view A_B_BY_ID1_AND_ID2 as 
select A.id1, 
     A.id2, 
     min(val1) as x 
from A 
join B on A.id1 = B.id1 and A.id2 = B.id2 
group by A.id1, 
     A.id2 

następnie utworzyć dto do reprezentowania tych danych:

@Entity(table="A_B_BY_ID1_AND_ID2") 
@Data //are you on board with lombok? 
public class ABById1AndId2 { 
    @Column 
    private int x; 
    @Column 
    private int id1; 
    @Column 
    private int id2; 
} 

następnie dostęp do niego jak nic innego:

session.createCriteria(ABById1AndId2.class).add(Restrictions.gt("x", 10)).list(); 
3

Sub-selects in th Klauzula e from nie jest obecnie obsługiwana przez Hibernate. Jednak zapytanie może być zapisane w sposób prostszy i bardziej efektywne formy wykorzystując klauzulę HAVING:

SELECT A.id1, A.id2, 
FROM A JOIN B ON A.id1 = B.id1 AND A.id2 = B.id2 
GROUP BY A.id1, A.id2 
HAVING min(val1) > 10 

Powyższe zapytanie może być łatwo przeniesione do HQL lub kryteria.