Spring data jpa JPA规范:从列表中选择至少有一个带有属性的参数的所有实体
我有两个实体与许多关系Spring data jpa JPA规范:从列表中选择至少有一个带有属性的参数的所有实体,spring-data-jpa,criteria,Spring Data Jpa,Criteria,我有两个实体与许多关系 @Entity @Table public class TranslationUnit implements Serializable { @Id private Long id; @ManyToMany(mappedBy = "translationUnit", fetch = FetchType.EAGER) private Set<Category> categories = new HashSet<>(); } @Entit
@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<>();
}
我需要能够指定类别名称列表(list),并选择至少有一个类别具有指定名称的TranslationUnits。
我有几个其他的过滤选项,应该一起使用,我成功地为它们建立了规范。但我一直坚持这一条
请帮忙
另外,我现有的一个规范如下所示:
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()]));
};
规范idSpec=(规范)(r、q、cb)->{
列表谓词=新的ArrayList();
如果(!filterRequest.GetTranslationInitiatids().isEmpty())
add(r.get(TranslationUnit.id).in(filterRequest.getTranslationInitiatids());
返回cb.and(predicates.toArray(新谓词[predicates.size()]);
};
你好。您可以使用中按类别名称列表筛选翻译单位。我相信,使用标准API时会是这样:
Root<TranslationUnit> itemsRoot = ...;
Join join = itemsRoot.join("categories");
List<Predicate> predicates = new ArrayList<>();
predicates(join.get("name").in(categoryNamesList));
Root itemsRoot=。。。;
Join-Join=itemsRoot.Join(“类别”);
列表谓词=新的ArrayList();
谓词(join.get(“name”).in(categoryNamesList));
您想要CriteriaAPI还是JPQL?你的其他规格看起来怎么样?嘿。我需要标准API。我将我的问题附加到现有的规范中。谢谢。因为我可以看到,您已经有了中的示例。因此,您要查找的内容类似于您已经使用的in谓词。或者您想做其他事情吗?在我的工作示例中,我选择了所有需要id的TranslationUnits。id只是一个长值。但类别是TranslationUnit中的一个集合,每个类别都有名称。所以,有很多,正如我所说的,我需要得到一个结果列表,其中至少有一个类别的名称来自提供的列表。我希望现在更清楚了。谢谢。
Root<TranslationUnit> itemsRoot = ...;
Join join = itemsRoot.join("categories");
List<Predicate> predicates = new ArrayList<>();
predicates(join.get("name").in(categoryNamesList));