Java QueryDSL JPA语法错误,集合中包含?
我有一个类似于以下内容的JPA实体bean:Java QueryDSL JPA语法错误,集合中包含?,java,jpa,eclipselink,querydsl,Java,Jpa,Eclipselink,Querydsl,我有一个类似于以下内容的JPA实体bean: @Entity class License { @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name = "LicenseTags") Set<Tag> tags; // Skipped remaining members } 我在listdinctinct java.lang.IllegalArgumentException: An exceptio
@Entity
class License {
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "LicenseTags")
Set<Tag> tags;
// Skipped remaining members
}
我在listdinctinct
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服务器开源版本3.0.1(build 22),它反过来使用EclipseLink捆绑包版本:2.0.1.v20100213-r6600
关于Tilmann,可能是缺少括号,也可能是“元素”,我不确定它是否是JPQL的一部分 尝试直接执行JPQL以确定错误所在
您的查询似乎效率很低,您应该只使用从许可证到标记的联接。看起来您在JPA查询中使用的是Hibernate模板。试试这个
JPAQuery query = new JPAQuery (entityManager, EclipseLinkTemplates.DEFAULT);
从下一个版本开始,将自动检测JPA提供程序,并在此基础上选择适合JPQL使用的模板
参考手册中描述了当前逻辑
您也可以尝试这样表达您的查询
List<License> result = query.from(license)
.where(license.tags.any().in(tags))
.listDistinct(license);
List result=query.from(许可证)
.where(license.tags.any().in(tags))
.1(许可证);
是否尝试使用JPA解决方案CriteriaBuilder.in()
。实际上,上面的内容只是一个摘录,在同一个查询中执行了许多其他搜索条件。我们刚刚将它从CriteriaBuilder迁移到QueryDSL,因为查询的CB语法版本变得非常模糊我同意你的观点,不错的选择。是的,对于上面提到的检查,我可以使用一个join:),但是接下来要实现的步骤我会遇到麻烦:只列出没有任何给定标记的许可证。在我们使用查询时,性能不是一个问题。非常感谢Timo给出的这一有见地的答复。我不知道必须选择方言模板:)这修复了我遇到的语法问题:)但是:您提供的缩写查询无法按预期工作。我在这里记录了这一点:好的,我也会研究这个问题。
List<License> result = query.from(license)
.where(license.tags.any().in(tags))
.listDistinct(license);