gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:37:28 25 4
gpt4 key购买 nike

尝试使用 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()将返回ArrayList<Integer> [1]

产品:

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 上的 Jboss AS 7 和 Hibernate 4.2.7.SP1-redhat-3

最佳答案

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

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

所以,看来您需要执行 join 而不是 get:

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

无论如何,为我工作。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com