Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java hibernate条件中的子选择_Java_Postgresql_Hibernate_Criteria_Hibernate Criteria - Fatal编程技术网

Java hibernate条件中的子选择

Java hibernate条件中的子选择,java,postgresql,hibernate,criteria,hibernate-criteria,Java,Postgresql,Hibernate,Criteria,Hibernate Criteria,我有一个带有列名的sql表 name, id1, id2, val1 id1, id2, key1, key2 和一个具有列名的表B name, id1, id2, val1 id1, id2, key1, key2 这是我的sql查询 选择 v1.id1, v1.id2 从…起 选择 A.id1, A.id2, minval1作为x 从 在A.id1=B.id1和A.id2=B.id2上连接B 按A.id1、A.id2分组 作为v1 其中v1.x>10 使用DetachedCriter

我有一个带有列名的sql表

name, id1, id2, val1
id1, id2, key1, key2
和一个具有列名的表B

name, id1, id2, val1
id1, id2, key1, key2
这是我的sql查询

选择 v1.id1, v1.id2 从…起 选择 A.id1, A.id2, minval1作为x 从 在A.id1=B.id1和A.id2=B.id2上连接B 按A.id1、A.id2分组 作为v1 其中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创建标准吗


非常感谢。

HQL和Criteria对象都不支持从选择中选择。这里的解决方案将命名为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"
    )
}) 

考虑为所需的数据创建一个视图:

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();
Hibernate暂时不支持from子句中的子选择。但是,可以使用HAVING子句以更简单、更高效的形式重写查询:

选择A.id1、A.id2、, 从A.id1=B.id1和A.id2=B.id2上的连接B 按A.id1、A.id2分组 最小值大于10的
上述查询可以很容易地移植到HQL或Criteria。

Criteria查询适用于实体,而不是表。我们不知道实体是什么样子。@JBNizet我已经为我想要的表和sql提供了列。除此之外,你还需要更多的信息吗。您能否通过标准为子选择提供通用解决方案?请随意假设任何相应的实体结构