java - 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()),但我确信有某种方法可以使用谓词来获取它。
解决方案
使用 CriteriaBuilder.isMember 方法:
Predicate predicateForGroup = cb.isMember(group, root.get(TimetableItem_.GROUPS));
推荐阅读
- amazon-s3 - 如何解决 S3ServiceException:尝试从 Redshift 卸载时 Airflow 中的访问密钥 ID 无效
- asp.net-core - 在一个页面上创建/更新一对多关系模型
- python - 将数据插入我的 Postgres 数据库时出现问题,错误:列 "xyz" 缺少数据,而实际上有一个零作为值
- javascript - 未定义单击功能,我不知道为什么
- javascript - Chart.js - 有没有办法总是在折线图上显示线?(实线)
- python - 获取一列 c(,) 中具有向量的 csv
- php - 如何在基本 URL 之后设置适当的变量参数?- 代码点火器
- php - 单个 wordpress 页面未显示更新
- kotlin - kotlin - 如何在另一个参数中重用一个参数的值
- python - 在现有图形上添加附加数据