[英]QueryDSL how do I create a SubQuery with its own joins?
I am trying to build a subquery for a QueryDSL select that uses an exists clause in a BooleanExpression.我正在尝试为在 BooleanExpression 中使用exists子句的 QueryDSL select 构建子查询。
The data model is such that there are projects which contain a single media.数据 model 使得有些项目包含单个媒体。 Media can have many dimensions.媒体可以有很多维度。 I am looking to select projects that have certain dimensional data and am using a subquery to accomplish that.我正在寻找具有特定维度数据的 select 项目,并且正在使用子查询来实现这一点。
The subquery looks like this:子查询如下所示:
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();
I store this as a predicate but, when I try to utilize it inside of a parent query I get an error: antlr.NoViableAltException: unexpected token: elements
我将其存储为谓词,但是当我尝试在父查询中使用它时出现错误: antlr.NoViableAltException: unexpected token: elements
The generated portion that is causing the error looks something like this (from the hibernate.hql.internal logs):导致错误的生成部分看起来像这样(来自 hibernate.hql.internal 日志):
... and ((exists (select 1
from com.app.model.Media media
inner join elements(media.dimensions)
That is the error that happens when I plug it into a master query like this:这是当我将它插入到这样的主查询时发生的错误:
JPAQuery<ResponseCurve> query = new JPAQuery<>(this.entityManager);
query.select().from(project)
.where(project.state.eq(inputState))
.where(subExpression);
There are two possible issues with this query:此查询有两个可能的问题:
dimensions
, but you never associated it with the join to media.dimensions
您正在尝试引用别名dimensions
,但您从未将其与加入media.dimensions
相关联dimension.dimensionType
without a join.您在没有连接的情况下取消引用dimension.dimensionType
。 For identifier values this is possible, for any other property, it is not.对于标识符值,这是可能的,对于任何其他属性,则不是。What about:关于什么:
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.