QueryDSL如何创建具有自己的联接的SubQuery?

问题描述 投票:0回答:1

我正在尝试为使用BooleanExpression中的exists子句的QueryDSL select构建子查询。

数据模型使得某些项目包含单个媒体。媒体可以有很多尺寸。我正在寻找选择具有特定维度数据的项目,并正在使用子查询来完成该任务。

子查询看起来像这样:

QProject project = QProject.project;
QMedia media = QMedia.media;

Predicate subExpression = JPAExpressions.selectOne()
            .from(media)
            .innerJoin(media.dimensions)
            .where(project.media.id.eq(media.id),
                dimension.dimensionType.id.eq(Long.valueOf(inputDimensionType))).exists();

我将此存储为谓词,但是当我尝试在父查询中使用它时,出现错误:antlr.NoViableAltException: unexpected token: elements

引起错误的生成部分看起来像这样(来自hibernate.hql.internal日志:]

... and ((exists (select 1
from com.app.model.Media media
  inner join elements(media.dimensions)

这是将其插入这样的主查询中时发生的错误:

JPAQuery<ResponseCurve> query = new JPAQuery<>(this.entityManager);
query.select().from(project)
  .where(project.state.eq(inputState))
  .where(subExpression);
java hibernate querydsl
1个回答
0
投票

此查询存在两个可能的问题:

  1. 您正在尝试引用别名dimensions,但从未将其与media.dimensions的联接相关联>
  2. 您在没有联接的情况下取消引用dimension.dimensionType。对于标识符值,这是可能的,对于任何其他属性,则不可能。
  3. 关于:

QProject project = QProject.project;
QMedia media = QMedia.media;
QDimension dimension = QDimension.dimension;

Predicate subExpression = JPAExpressions.selectOne()
        .from(project.media, media)
        .innerJoin(media.dimensions, dimension )
        .on(dimension.dimensionType.id.eq(Long.valueOf(inputDimensionType))
© www.soinside.com 2019 - 2024. All rights reserved.