JPA - 使用Criteria API从{Embeddable查询多对多...

时间:2015-09-04 11:40:38

标签: java hibernate jpa spring-data

我有以下类映射(仅包含相关部分,实际映射是在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

0 个答案:

没有答案