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));