2016-12-02 198 views
12

我有一個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

標準查詢適用於實體而非表格。我們不知道實體是什麼樣子。 –

+1

@JBNizet我已經提供了我想要的表和sql的列。除此之外,你還需要更多的信息嗎? 你能否提出一個通用標準的子選擇的通用解決方案?(隨意假設任何相應的實體結構) – sumit

回答

1

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

@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

第次選擇Efrom子句暫時不受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或條件。