当尝试使用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<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
我是否在成员变量的注释中遗漏了什么?似乎并非如此,因为这足以生成交叉连接。
env为Jboss 7,在jdk-6上使用Hibernate 4.2.7.SP1-redhat-3。
发布于 2014-10-25 21:51:37
您的模式正在创建两个单独的表:
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");至少为我工作过。
https://stackoverflow.com/questions/26555279
复制相似问题