我有以下类映射(仅包含相关部分,实际映射是在getter上完成的,而不是属性):
@Entity
class Item {
@Id
private Long id;
}
@Entity
class RootEntity {
@Id
private Long id;
@Embedded
private Emb relation;
}
@Embeddable
class Emb {
@ManyToMany
@JoinTable(...)
private Set<Item> items;
}
我正在尝试获取属于特定Item
的所有RootEntity
个。以下JPQL查询按预期工作:
SELECT i FROM RootEntity r LEFT JOIN r.relation.items i WHERE r.id = :id
但是,以下条件查询不会:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Item> query = cb.createQuery(Item.class);
Root<RootEntity> root = query.from(RootEntity.class);
query = query.select(root.join(RootEntity_.relation).join(Emb_.items, JoinType.LEFT));
Predicate p = cb.equal(root.get(RootEntity_.id), wantedId);
query = query.where(p);
return em.createQuery(query).getResultList();
生成的SQL包含Item
列的所有Item
列,但FROM
部分只包含RootEntity
表,没有所需的Item
联接,因此查询失败。
我在多对多映射中测试了条件查询,而中间没有可嵌入的实体,并且它可以工作。
所以,问题是 - 我在使用可嵌入实体方面做错了什么,或者这是一个错误?
Spring Data版本:1.8.2.RELEASE
Hibernate版本:4.3.6.Final
基础RDBMS:MySQL