Java QueryDSL从子查询中选择别名为的值

Java QueryDSL从子查询中选择别名为的值,java,querydsl,Java,Querydsl,我有两个实体,如下所示 Parent { String parentID; String parentName; ... } - 父母和孩子之间是一对多的关系 我的意图是拥有下面的SQL SELECT p.parentID, p.parentName, c.childrenHeightRange FROM Parent p INNER JOIN ( SELECT parentID, (CASE WHEN (min(height) = max(he

我有两个实体,如下所示

Parent {
String parentID;
String parentName;
...
}
-

父母和孩子之间是一对多的关系

我的意图是拥有下面的SQL

    SELECT p.parentID, p.parentName, c.childrenHeightRange
    FROM
    Parent p
    INNER JOIN
    (
    SELECT parentID, (CASE WHEN (min(height) = max(height)) THEN cast(min(height) as varchar) ELSE cast(min(height) as varchar) + ' - '  + cast(max(height) as varchar) END) as childrenHeightRange
FROM Child GROUP BY parentID) as c
    ON (p.parentID = c.parentID)
对于上面的查询,我使用了一个用于childHeightRange的CaseBuilder,如下所示

   JPASubQuery subQuery = new JPASubQuery().from(child).groupBy(child.parentID);

    Expression<String> heightCaseExpression = new CaseBuilder()
            .when(child.height.min().eq(child.height.max()))
            .then(child.height.min().stringValue())
            .otherwise(child.height.min().stringValue() +"-"+child.height.max().stringValue())
            .as("childrenHeightRange");
如何从子查询中引用childrenHeightRange

请帮忙


谢谢

在Querydsl JPA中,您只能在where部分使用子查询,因此您需要重新构造查询

   JPASubQuery subQuery = new JPASubQuery().from(child).groupBy(child.parentID);

    Expression<String> heightCaseExpression = new CaseBuilder()
            .when(child.height.min().eq(child.height.max()))
            .then(child.height.min().stringValue())
            .otherwise(child.height.min().stringValue() +"-"+child.height.max().stringValue())
            .as("childrenHeightRange");
query.from(parent).innerjoin(subquery.list(child.parentID,heightCaseExpression )).on(parent.parentID.eq(child.parentID))
 .list(parent.parentID,parent.parentName, ............);