为什么CriteriaBuilder会为" in"创建格式错误的查询? CollectionTable?

时间:2014-10-24 19:52:51

标签: java mysql hibernate jpa jpa-2.0

当尝试使用CriteriaBuilder生成动态查询时,Hibernate没有针对与@ElementCollection关联的实体成员变量创建正确的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()将返回[1]} [1]

产地:

ArrayList<Integer>

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

我在成员变量的注释中遗漏了什么?似乎不是这样,因为它足以生成交叉连接。

env是Jboss AS 7,在jdk-6上使用Hibernate 4.2.7.SP1-redhat-3

1 个答案:

答案 0 :(得分:1)

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

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

所以,似乎你需要进行连接而不是get:

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

无论如何都为我工作。