java - QueryDSL Unexpected Token ,带有 any() 和 in 子句

标签 java hibernate querydsl

我有两个模型,LocationLocationAttribute,具有多对多关系。 我有一个 LocationAttribute ID 列表,我想找到至少有一个的所有 Locations 这些属性。

位置.java:

@Entity
public class Location {

    @Id
    @GeneratedValue
    @Column(name="LOCATION_ID")
    protected int id;

    @ManyToMany(targetEntity = LocationAttribute.class)
    @JoinTable(name="LOCATION_TO_LOCATION_ATTRIBUTE",
            joinColumns = @JoinColumn(name="LOCATION_ID", referencedColumnName = "LOCATION_ID"),
            inverseJoinColumns = @JoinColumn(name="LOCATION_ATTRIBUTE_ID", referencedColumnName = "LOCATION_ATTRIBUTE_ID")
    )
    private List<LocationAttribute> locationAttributes;
}

位置属性.java:

@Entity
public class LocationAttribute {

    @Id
    @GeneratedValue
    @Column(name="LOCATION_ATTRIBUTE_ID")
    protected int id;
}

我尝试了以下 QueryDSL 代码:

List<Integer> locationAttributeIds = new ArrayList<Integer>();
locationAttributeIds.add(1);
locationAttributeIds.add(2);
locationAttributeIds.add(3);

QLocation location = QLocation.location;
JPAQuery query = new JPAQuery(entityManager, JPQLTemplates.DEFAULT);
query.from(location) .where(location.locationAttributes.any().id.in(locationAttributeIds));
query.list(location);

如果 locationAttributeIds 有 0 或 1 个元素,代码工作正常。但是,当我有超过 1 个元素时,我会收到此错误:

java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: , near line 5, column 53 [select location
from ch.locatee.test.querydslerror.locatee.Location location
where exists (select location_locationAttributes_cc6d8
from location.locationAttributes as location_locationAttributes_cc6d8
where location_locationAttributes_cc6d8.id in :x1_0_, :x1_1_, :x1_2_)]
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
    at org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:458)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.getResultList(AbstractJPAQuery.java:194)
    at com.mysema.query.jpa.impl.AbstractJPAQuery.list(AbstractJPAQuery.java:246)
    at ch.locatee.test.querydslerror.locatee.AppTest.testSomething(AppTest.java:63)

我找到了很多与我的问题相关的网站,但不确定如何解决该问题。

我做了一个快速测试项目,你可以在 Github 上找到它:https://github.com/bekoeppel/QueryDslInErrorTest . mvn test 产生上述错误。

如果您提出我如何从列表中找到至少具有一个 LocationAttribute.id 的所有 Locations,我将不胜感激。谢谢!

最佳答案

改为使用以下 JPAQuery 构造函数

new JPAQuery(entityManager);

JPQLTemplates 提供通用序列化,它不会找到 Hibernate 的所有 JPQL 变体。仅使用 EntityManager 参数,Querydsl 将为您选择正确的 JPQLTemplates 子类实例。

关于java - QueryDSL Unexpected Token ,带有 any() 和 in 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29865648/

相关文章:

mysql - 如何在querydsl中使用mysql now()函数?

java - 无法从 eclipse 中的其他项目引用 java 类

java - EntityManager..getResultList() 中的 ArrayIndexOutOfBoundsException

hibernate - 约束条件查询以获取笛卡尔积并返回结果作为对象数组列表

spring - 不同集合的QueryDsl MongoRepository

java - Querydsl 空安全串联

java - 归还藏品

java - 如何使用 java WebDriver 在 Firefox 中打开 "about:preferences"

java - 将 Spring 批处理连接到 Spring 集成工作流程

java - 无法将数据插入到数据库 mysql 中的我的表中