首页 > 解决方案 > JPA。过滤字段 Set<> 包含特定值的实体

问题描述

我有一个实体,其中一个字段是<Set> groups.

@Entity
public class TimetableItem {
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private Long id;
    
        /*different fields */
    
   @ManyToMany
   @JoinTable(name = "timetable_items_groups",
              joinColumns = @JoinColumn(name = "timetable_item_id"),
              inverseJoinColumns = @JoinColumn(name = "group_id"))
  private Set<Group> groups;

我需要获取 Set 包含某个组的所有时间表项目(Set 也可以有很多不同的组。如果“我的组”是其中之一 - 这就是我需要的)。

public List<TimetableItem> findItemsWithGroup(Group group) {
   CriteriaBuilder cb = em.getCriteriaBuilder();
   CriteriaQuery<TimetableItem> query = cb.createQuery(TimetableItem.class);
   Root<TimetableItem> root = query.from(TimetableItem.class);

   //something like that but it doesn’t work
   Predicate predicateForGroup = cb.isTrue(root.get(TimetableItem_.GROUPS).in(group));

   query.where(predicateForGroup);
List<TimetableItem> timetableItems = em.createQuery(query).getResultList();

如果我在没有任何条件的情况下运行代码,我可以在调试器中看到我List<TimetableItem> timetableItems 拥有数据库中的所有项目,并且每个项目都包含Set<Group>其中的组。

截屏

当然,我可以“手动”找到我需要的项目(例如使用 .stream()),但我确信有某种方法可以使用谓词来获取它。

标签: javajpaspring-data-jpa

解决方案


使用 CriteriaBuilder.isMember 方法:

Predicate predicateForGroup = cb.isMember(group, root.get(TimetableItem_.GROUPS));

推荐阅读