Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java QueryDSL JPA语法错误,集合中包含?_Java_Jpa_Eclipselink_Querydsl - Fatal编程技术网

Java QueryDSL JPA语法错误,集合中包含?

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

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

@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);