2016-12-02 199 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或条件。