2016-12-02 4 views
12

у меня есть SQL таблицу А с именами столбцовSub-Select В критерии Hibernate

name, id1, id2, val1 

и таблицу B с именами столбцов

id1, id2, key1, key2 

и это мой 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 

с помощью DetachedCriteria i удалось сформировать подзапрос

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"); 

, но я сталкиваюсь с трудностями при создании внешнего запроса.

любое предложение, как я могу создать критерии для вышеуказанного SQL?

Спасибо в ожидании.

+1

Критерии запроса работают над объектами, а не с таблицами. Мы понятия не имеем о том, как выглядят сущности. –

+1

@JBNizet Я предоставил столбцы для таблиц и sql, которые я хочу. вам нужна дополнительная информация. вы можете предложить общее решение для подвыборки по критериям? (Не стесняйтесь принимать любую соответствующую структуру сущности) – sumit

ответ

1

Выбрать из Select не поддерживается ни HQL, ни объектом Criteria. Решением здесь будет 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

Рассмотрим создание представления для данных, вам необходимо:

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 

Затем создать DTO, чтобы представить эти данные:

@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; 
} 

обращаться к нему как-нибудь еще:

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

Подбирает в Предложение e from не поддерживается Hibernate в настоящее время. Тем не менее, ваш запрос можно переписать в более простой и эффективной форме, используя пункт 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 

Этот запрос может быть легко перенесен на HQL или критериев.