QueryDSL JPA syntax error with contains on Set?
我有一个类似于以下内容的JPA实体bean:
1 2 3 4 5 6 7 8 | @Entity class License { @ManyToMany(fetch = FetchType.EAGER) @JoinTable(name ="LicenseTags") Set<Tag> tags; // Skipped remaining members } |
1 2 3 4 5 6 7 8 9 | 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); |
我在
的行上收到以下异常
1 2 3 4 5 6 7 8 9 10 11 12 | 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捆绑版本:2.0.1.v20100213-r6600
关于蒂尔曼,
好像您在JPA查询中使用的是Hibernate模板。试试这个
1 | JPAQuery query = new JPAQuery (entityManager, EclipseLinkTemplates.DEFAULT); |
从下一个版本开始,将自动检测JPA提供程序,并根据此选择适合JPQL使用的模板。
尽管当前逻辑在参考手册http://www.querydsl.com/static/querydsl/2.6.0/reference/html/ch02.html#d0e185
中进行了描述
您也可以尝试这样表达您的查询
1 2 3 | List<License> result = query.from(license) .where(license.tags.any().in(tags)) .listDistinct(license); |
可能是缺少括号,或者是\\'elements \\',我不确定它是否是JPQL的一部分。
尝试直接执行JPQL以确定出了什么问题。
您的查询似乎也效率很低,您应该只使用从许可证到标签的联接。