尝试使用CriteriaBuilder生成动态查询时,Hibernate并未针对与@ElementCollection关联的Entities成员变量创建正确的SQL。

样本实体:

@Entity
@Table(name = "myclass")
public class MyClass {
...
    @ElementCollection
    @CollectionTable(
            name = "myclass_mysubclass",
            joinColumns = @JoinColumn(name = "myclass_id")
    )
    @Column(name = "mysubclass_id")
    private List<Integer> mySubClassIDs;
...
}


CriteriaBuilder代码:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(MyClass.class);
Root<T> root = criteriaQuery.from(MyClass.class);
Expression<Object> e = root.get("mySubClassIDs");
List<Object> o = (List<Object>) entry.getValue();
criteriaQuery.where(e.in(o));


其中entry.getValue()将返回[cc]的ArrayList<Integer>

产生:

SELECT distinct count(myclass0_.id) as col_0_0_
FROM hotel myclass0_
cross join myclass_mysubclass mySubClassids1_
where myclass0_.id=mySubClassids1_.myclass_id and (. in (1))


Hibernate为什么不能正确生成“ in”子句? “。”应该是mySubClassids1_.mysubclass_id

我在成员变量的注释中缺少什么吗?似乎并非如此,因为它足以生成交叉联接。

环境是在jdk-6上具有Hibernate 4.2.7.SP1-redhat-3的Jboss AS 7

最佳答案

您的架构正在创建两个单独的表:

create table myclass (
    id int8 not null,
    primary key (id)
);
create table myclass_mysubclass (
    myclass_id int8 not null,
    mysubclass_id int4
);


因此,似乎您需要执行联接而不是获取:

Expression<Object> e = root.join("mySubClassIDs");


无论如何为我工作。

关于java - 为什么CriteriaBuilder为“在” CollectionTable中创建格式错误的查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26555279/

10-10 09:59