首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么CriteriaBuilder要为"in“CollectionTable创建格式错误的查询?

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

Stack Overflow用户
提问于 2014-10-24 19:52:50
回答 1查看 141关注 0票数 0

当尝试使用CriteriaBuilder生成动态查询时,Hibernate没有针对与@ElementCollection关联的实体成员变量创建适当的SQL。

抽样实体:

代码语言:javascript
复制
@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代码:

代码语言:javascript
复制
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<Integer>

生产:

代码语言:javascript
复制
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

我是否在成员变量的注释中遗漏了什么?似乎并非如此,因为这足以生成交叉连接。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-25 21:51:37

您的模式正在创建两个单独的表:

代码语言:javascript
复制
create table myclass (
    id int8 not null,
    primary key (id)
);
create table myclass_mysubclass (
    myclass_id int8 not null,
    mysubclass_id int4
);

因此,您似乎需要做一个连接,而不是get:

代码语言:javascript
复制
Expression<Object> e = root.join("mySubClassIDs");

至少为我工作过。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26555279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档