JPA 规范:Select 所有实体至少有一个参数来自列表的属性
JPA Specification: Select all entities which have at least one param with attribute from list
我有 2 个实体具有 ManyToMany 关系
@Entity
@Table
public class TranslationUnit implements Serializable {
@Id
private Long id;
@ManyToMany(mappedBy = "translationUnit", fetch = FetchType.EAGER)
private Set<Category> categories = new HashSet<>();
}
@Entity
@Table
public class Category implements Serializable {
@ManyToMany
@JoinTable(name = "category_translation_unit",
joinColumns = @JoinColumn(name = "categories_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "translation_units_id", referencedColumnName = "id"))
private Set<TranslationUnit> translationUnits = new HashSet<>();
}
在类别中我有1个字段,应该用于过滤:
String name;
我需要能够指定类别名称列表 (List),以及 select 那些至少有一个具有指定名称的类别的 TranslationUnit。
我还有其他几个过滤选项,它们应该一起使用,并且我成功地为它们构建了规范。但我一直坚持这个。
请帮忙。
P.S。我现有的规范之一如下所示:
Specification idSpec = (Specification) (r, q, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (!filterRequest.getTranslationUnitIds().isEmpty())
predicates.add(r.get(TranslationUnit_.id).in(filterRequest.getTranslationUnitIds()));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
美好的一天。您可以使用 IN 按类别名称列表过滤翻译单元。我相信,它看起来像这样使用 Criteria API:
Root<TranslationUnit> itemsRoot = ...;
Join join = itemsRoot.join("categories");
List<Predicate> predicates = new ArrayList<>();
predicates(join.get("name").in(categoryNamesList));
我有 2 个实体具有 ManyToMany 关系
@Entity
@Table
public class TranslationUnit implements Serializable {
@Id
private Long id;
@ManyToMany(mappedBy = "translationUnit", fetch = FetchType.EAGER)
private Set<Category> categories = new HashSet<>();
}
@Entity
@Table
public class Category implements Serializable {
@ManyToMany
@JoinTable(name = "category_translation_unit",
joinColumns = @JoinColumn(name = "categories_id", referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "translation_units_id", referencedColumnName = "id"))
private Set<TranslationUnit> translationUnits = new HashSet<>();
}
在类别中我有1个字段,应该用于过滤:
String name;
我需要能够指定类别名称列表 (List),以及 select 那些至少有一个具有指定名称的类别的 TranslationUnit。 我还有其他几个过滤选项,它们应该一起使用,并且我成功地为它们构建了规范。但我一直坚持这个。
请帮忙。
P.S。我现有的规范之一如下所示:
Specification idSpec = (Specification) (r, q, cb) -> {
List<Predicate> predicates = new ArrayList<>();
if (!filterRequest.getTranslationUnitIds().isEmpty())
predicates.add(r.get(TranslationUnit_.id).in(filterRequest.getTranslationUnitIds()));
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
};
美好的一天。您可以使用 IN 按类别名称列表过滤翻译单元。我相信,它看起来像这样使用 Criteria API:
Root<TranslationUnit> itemsRoot = ...;
Join join = itemsRoot.join("categories");
List<Predicate> predicates = new ArrayList<>();
predicates(join.get("name").in(categoryNamesList));