我有一个类似于以下内容的JPA实体bean:
@Entity
class License {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "LicenseTags")
Set<Tag> tags;
// Skipped remaining members
}
Tag
本身也是Entity
,其ID和名称。现在我想查询附加了某些标签的许可证。当我尝试以下查询
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开源版3.0.1(版本22),后者又使用EclipseLink Bundle-Version:2.0.1.v20100213-r6600
此致,蒂尔曼
答案 0 :(得分:5)
看起来您在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);
答案 1 :(得分:1)
可能缺少括号,或者可能是'元素',我不确定它是否是JPQL的一部分。
尝试直接执行JPQL以确定错误。
您的查询效率似乎也非常低效,您应该只使用从许可证到标签的连接。