Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 QueryDSL和具有元组条件的子查询_Java_Hibernate_Jpa_Syntax_Querydsl - Fatal编程技术网

Java QueryDSL和具有元组条件的子查询

Java QueryDSL和具有元组条件的子查询,java,hibernate,jpa,syntax,querydsl,Java,Hibernate,Jpa,Syntax,Querydsl,我试图在QueryDSL中编写一个查询,以获取表中按父ID分组的最早元素 SQL等效项应为: SELECT a.* FROM child a INNER JOIN ( SELECT parentId, MAX(revision) FROM child GROUP BY parentId ) b ON ( a.parentId = b.parentId AND a.revision = b.revision ) 现在在Qu

我试图在QueryDSL中编写一个查询,以获取表中按父ID分组的最早元素

SQL等效项应为:

SELECT a.* FROM child a
    INNER JOIN
    (
        SELECT parentId, MAX(revision) FROM child GROUP BY parentId
    ) b
    ON ( 
        a.parentId = b.parentId AND a.revision = b.revision
    )
现在在QueryDSL中,我被语法难住了

JPQLQuery<Tuple> subquery = JPAExpressions
                .select(child.parent, child.revision.max())
                .from(child)
                .groupBy(child.parent);

HibernateQuery<Child> query = new HibernateQuery<>(session);
query.from(child)
    .where(child.parent.eq(subquery.???).and(child.revision.eq(subquery.???))));
还有很多语法错误


现在我使用脏循环,因为我还没有找到解决方案。

在JPA中,子查询只能出现在where部分

这是我对你的问题的看法

select(child).from(child).where(child.revision.eq(
  select(child2.revision.max())
 .from(child2)
 .where(child2.parent.eq(child.parent))
 .groupBy(child2.parent))).fetch()

您可以使用
Expressions.list()
为in子句指定多个列:

query.from(child).where(Expressions.list(child.parent, child.revision).in(subquery));
另一种方法是使用
innerJoin()
,就像在原始SQL中一样

Expressions.list(ENTITY.year, ENTITY.week).in(//
                    Expressions.list(Expressions.constant(1029), Expressions.constant(1)),
                    Expressions.list(Expressions.constant(1030), Expressions.constant(1)),
                    Expressions.list(Expressions.constant(1031), Expressions.constant(1))
将是您正在寻找的,但QueryDSL从中生成错误的SQL:

((p0_.year , p0_.week) in (1029 , 1 , (1030 , 1) , (1031 , 1)))

子表中是否有唯一的键?是的,child.id和parent.parentId是各自的主键。(非常感谢您抽出时间回答:)谢谢您的回答。当修订号相同时,此查询不起作用。Child.revision不是唯一的。我的查询中没有“child2”,只有一个父级及其子级。这就是为什么我需要匹配元组,parentId和revision的值在queryOk的连接部分,子版本在父版本的范围内是唯一的吗?如果没有,那么这将返回每个父级的多行。我在问题中添加了一个数据示例。Hi@TimoWestkämper,我有一个类似的查询,但是如果我将eq()放在那里,在运行查询时会出现此错误:“无法提取ResultSet;SQL[n/a];嵌套异常为org.hibernate.exception.DataException:无法提取结果集”。我认为子查询返回的是一个resultset,而不是单个结果。当我在()中使用时,查询可以运行,但在某些情况下,结果并不像预期的那样。这一个对我有用!您的解决方案在mysql中给了我一个错误,因为
操作数应该包含2列
Expressions.list(ENTITY.year, ENTITY.week).in(//
                    Expressions.list(Expressions.constant(1029), Expressions.constant(1)),
                    Expressions.list(Expressions.constant(1030), Expressions.constant(1)),
                    Expressions.list(Expressions.constant(1031), Expressions.constant(1))
((p0_.year , p0_.week) in (1029 , 1 , (1030 , 1) , (1031 , 1)))