【发布时间】:2020-05-14 13:06:35
【问题描述】:
我正在尝试为在 BooleanExpression 中使用 exists 子句的 QueryDSL 选择构建子查询。
数据模型是这样的,即存在包含单个媒体的项目。媒体可以有很多维度。我正在寻找具有特定维度数据并使用子查询来完成的项目。
子查询如下所示:
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);
【问题讨论】:
-
我已经删除了我的答案,因为我误解了子查询在做什么,我的错。出于好奇,如果您有
QDimension dimension = QDimension.dimension并调用.innerJoin(media.dimensions, dimension)而不是当前存在的.innerJoin(media.dimensions)会发生什么?