Sub-Select В условиях спящего режима

У меня есть таблица sql A с именами столбцов

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 я удалось сформировать подзапрос

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

Подвыборки в предложении 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 или Criteria.

Ответ 2

Выбор из 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"
    )
}) 

Ответ 3

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

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