簡體   English   中英

子選擇在休眠標准中

[英]Sub-Select In hibernate criteria

我有一個帶有列名的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的標准?

謝謝你的期待。

暫時不支持from子句中的子選擇。 但是,通過使用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。

考慮為您需要的數據創建視圖:

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

HQL和Criteria對象既不支持從Select中選擇。 這里的解決方案是命名查詢。

@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"
    )
}) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM