gpt4 book ai didi

java - JPA Criteria api 通过嵌入式 ID 加入

转载 作者:搜寻专家 更新时间:2023-11-01 02:08:59 24 4
gpt4 key购买 nike

我有以下实体:

@Entity
@Table(name = "place_revision")
public class PoiRevision {
@OneToMany(mappedBy = "pk.revision", cascade = {CascadeType.ALL})
private Collection<PoiRevisionCategory> categoryMapping;
// ...
}

@Entity
@Table(name = "place_revision__category")
@AssociationOverrides({
@AssociationOverride(name = "pk.revision",
joinColumns = @JoinColumn(name = "place_revision_id")),
@AssociationOverride(name = "pk.category",
joinColumns = @JoinColumn(name = "category_id"))
})
public class PoiRevisionCategory {
@EmbeddedId
private PoiRevisionCategoryId pk = new PoiRevisionCategoryId();
// ...
}

@Embeddable
public class PoiRevisionCategoryId implements Serializable {
@ManyToOne
private PoiRevision revision;
@ManyToOne
private Category category;
// ...
}

@Entity
@Table(name = "category")
public class Category {
@ManyToMany(targetEntity = Section.class, cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
@JoinTable(
name = "category__section",
joinColumns = @JoinColumn(name = "category_id"),
inverseJoinColumns = @JoinColumn(name = "section_id")
)
private Collection<Section> sections;
// ...
}

并希望选择 PoiRevisions,其中包含 Categories,其中包含一些 Sections。我正在使用 Spring-data Specification 查询数据库中的这些实体。

我的意图是写这样的东西:

Specification<PoiRevision> spec = new Specification<PoiRevision>() {
@Override
public Predicate toPredicate(Root<PoiRevision> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> conditions = new ArrayList<>(CONDITION_COUNT);

CollectionJoin<PoiRevision, PoiRevisionCategory> mapping = root.join(PoiRevision_.categoryMapping);
// BROKEN here as we cannot use nested path for joins
Join<PoiRevisionCategory, Category> categories = mapping.join("pk.category");
conditions.add(categories.get("sections").in(sections));

// ...

return cb.and(conditions.toArray(new Predicate[] {}));
}
};

但我们不能对此类连接使用嵌套路径,因为 JPA 提供程序(在我的例子中是 Hibernate)仅查找 PoiRevisionCategory 类的直接属性。而且我们不能将嵌入的 Id“加入”到我们的结果集中,因为它不是一个可管理的实体。

我真的被这个问题困住了,当翻译成 SQL 时,它似乎远非复杂,但它在 ORM 端有一些复杂性。

非常感谢任何想法。

最佳答案

完全切换到元模型 API 后,它变得更加清晰,我实际上能够加入嵌入式实体,就像我尝试使用字符串 api 但失败了一样。

所以正确的方法就是像往常一样加入

Join<PoiRevisionCategory, PoiRevisionCategoryId> pk = mapping.join(PoiRevisionCategory_.pk);
Join<PoiRevisionCategoryId, Category> cats = pk.join(PoiRevisionCategoryId_.category);
CollectionJoin<Category, Section> sec = cats.join(Category_.sections);
conditions.add(sec.get(Section_.id).in(sections));

而且它做得很好!

真松了一口气。

关于java - JPA Criteria api 通过嵌入式 ID 加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657895/

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