gpt4 book ai didi

java - 包含在 Set 上的 QueryDSL JPA 语法错误?

转载 作者:搜寻专家 更新时间:2023-11-01 02:13:53 24 4
gpt4 key购买 nike

我有一个类似于以下的 JPA 实体 bean:

@Entity
class License {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "LicenseTags")
Set<Tag> tags;

// Skipped remaining members
}

Tag 本身也是一个具有 id 和名称的 Entity。现在我想查询附加了特定标签的许可证。当我尝试以下查询时

Set<Tag> tags = ...;
final QLicense license = QLicense.license;
JPAQuery q = new JPAQuery(entityManager).from(license);

for (Tag tag : tags) {
q.where(license.tags.contains(tag));
}

Collection<License> result = q.listDistinct(license);

我在 listDistinct

行得到以下异常
java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Syntax error parsing the query [select distinct license
from License license
where ?1 in elements(license.tags)]: unexpected token [in].
Internal Exception: NoViableAltException(35!=[685:1: inExpression[boolean not, Object left] returns [Object node] : (t= IN n= inputParameter | t= IN LEFT_ROUND_BRACKET (itemNode= inItem ( COMMA itemNode= inItem )* | subqueryNode= subquery ) RIGHT_ROUND_BRACKET );])
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1328)
at com.sun.enterprise.container.common.impl.EntityManagerWrapper.createQuery(EntityManagerWrapper.java:425)
at com.mysema.query.jpa.impl.DefaultSessionHolder.createQuery(DefaultSessionHolder.java:35)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:139)
at com.mysema.query.jpa.impl.AbstractJPAQuery.createQuery(AbstractJPAQuery.java:108)
at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:276)
at com.mysema.query.support.ProjectableQuery.listDistinct(ProjectableQuery.java:104)

从解析器异常输出我只能猜测可能缺少括号。

我在查询集合中包含的值时做错了什么吗?

我正在使用 GlassFish Server Open Source Edition 3.0.1(build 22),后者又使用 EclipseLink Bundle-Version:2.0.1.v20100213-r6600

问候,蒂尔曼

最佳答案

看起来您正在 JPA 查询中使用 Hibernate 模板。试试这个吧

JPAQuery query = new JPAQuery (entityManager, EclipseLinkTemplates.DEFAULT); 

从下一个版本开始,将自动检测 JPA 提供程序,并根据此选择正确的 JPQL 使用模板。

引用手册中描述了当前逻辑 http://www.querydsl.com/static/querydsl/2.6.0/reference/html/ch02.html#d0e185

您也可以尝试这样表达您的查询

List<License> result = query.from(license)
.where(license.tags.any().in(tags))
.listDistinct(license);

关于java - 包含在 Set 上的 QueryDSL JPA 语法错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com