【发布时间】:2011-07-06 15:53:07
【问题描述】:
我有一个实体“父母”,它有一组枚举
private Set<MyEnum> myEnums = EnumSet.noneOf(MyEnum.class);
@CollectionOfElements(targetElement=MyEnum.class)
@JoinTable
(name="PARENT_MY_ENUM",
joinColumns=@JoinColumn(name="PARENT_ID"))
@Enumerated(EnumType.STRING)
@Column (name="MY_ENUM", nullable=false)
public Set<MyEnum> getMyEnums(){
return myEnums;
}
public MyEnum {
ENUM_A,
ENUM_B,
ENUM_C,
ENUM_D;
}
现在我想用 MyEnums 的集合搜索这个实体。仅应返回所有枚举都设置为搜索集合中的实体。 因此,如果实体 A 具有 ENUM_A、ENUM_B 和 ENUM_C,而实体 B 具有 ENUM_B、ENUM_C、ENUM_D,则使用搜索集合 ENUM_A、ENUM_B、ENUM_C 进行搜索应该只返回实体 A。搜索 ENUM_B 和 ENUM_C 应该什么都不返回。
我将如何在 Hibernate 中做到这一点? 如果我这样做了
select p from Parent p where p.myEnums IN (:searchCollection) and size(p.myEnums) = size(:searchCollection)
那么这将返回两个实体进行第一次搜索。
有什么想法吗?
更新:我进一步了解了如何在 MySQL 中执行此操作,但将其应用于 Hibernate 会生成无效的 SQL。 您可以使用带有 EXISTS 的子查询,例如:
WHERE EXISTS(
SELECT pa.PARENT_ID, count(pme.MY_ENUM) FROM PARENT pa, PARENT_MY_ENUM pme
where pa.PARENT_ID = pme.PARENT_ID
AND pme.MY_ENUM IN ('ENUM_A','ENUM_B')
GROUP BY pa.PARENT_ID HAVING count(pme.MY_ENUM) = 2
)
但是当我尝试在 Hibernate 中做同样的事情时:
select pa.ParentId, count(pa.myEnums) from Parent pa
WHERE pa.myEnums IN ('ENUM_A','ENUM_B')
GROUP BY pa.ParentId HAVING count(pa.myEnums) = 2
Hiberante 创建这个 SQL 语句:
select pa.CONTAINER_RELEASE_REFERENCE_ID as col_0_0_, count(.) as col_1_0_ from PARENT pa, PARENT_MY_ENUM enum1, PARENT_MY_ENUM enum2, PARENT_MY_ENUM enum3
where pa.PARENT_ID=enum1.PARENT_ID and pa.PARENT_ID=enum2.PARENT_ID and pa.PARENT_ID=enum3.PARENT_ID
and (. in ('ENUM_A' , 'ENUM_B'))
group by pa.PARENT_ID having count(.)=2
MySQL 抱怨 '.',这是从哪里来的,为什么 Hibernate 使用 3 个连接到 PARENT_MY_ENUM?
这是一个 Hibernate 错误还是我做错了什么?
【问题讨论】: