【问题标题】:Why is CriteriaBuilder creating a malformed query for "in" CollectionTable?为什么 CriteriaBuilder 会为“in”CollectionTable 创建格式错误的查询?
【发布时间】:2014-10-24 19:52:50
【问题描述】:

当尝试使用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] 的 ArrayList&lt;Integer&gt;

生产:

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

我在成员变量的注释中遗漏了什么吗?好像不是这样,因为生成交叉连接就足够了。

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

【问题讨论】:

    标签: java mysql hibernate jpa jpa-2.0


    【解决方案1】:

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

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

    无论如何都为我工作。

    【讨论】:

    • 谢谢尼古拉斯!但是由于各种原因,在这种特殊情况下不能使用 join。如上所示,创建了连接,只是“in”的表达式没有创建正确的左手操作数。它只有“。”并且没有指定表或列,即使它在创建交叉连接时知道连接表。
    • 尼古拉斯,我听从了你的建议,并明确地使用了加入。代码看起来有点难看,因为反射将用于确定成员变量的类类型,然后通过 if 语句决定构建适当的表达式,但我离题了 :)
    • 听起来有点像设计问题,但我很高兴你取得了进展。
    猜你喜欢
    • 2020-05-22
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多