如何使用JPA Criteria API查询Book实体的Set<People>是否包含指定人员
正确的Criteria查询实现
你需要先对多对多集合属性peoples执行join操作,再拼接匹配条件,完整示例如下:
// Spring环境下可直接@Autowired注入EntityManager @Autowired private EntityManager entityManager; public List<Book> listBooksReadByPeopleId(Long peopleId) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Book> cq = cb.createQuery(Book.class); Root<Book> bookRoot = cq.from(Book.class); // 对Book的peoples集合属性做内连接,关联到People实体 Join<Book, People> peopleJoin = bookRoot.join("peoples"); // 匹配关联的PeopleID等于传入的指定ID cq.where(cb.equal(peopleJoin.get("id"), peopleId)); return entityManager.createQuery(cq).getResultList(); }
如果已经持有People实体实例,不需要单独传ID的话,条件可以简化为:
cq.where(cb.equal(peopleJoin, targetPeopleInstance));
原写法问题说明
你之前直接用root.get("peoples")拿到的是集合类型的属性路径,无法直接读取集合内部元素的属性,必须通过join操作把集合打平为单条关联记录后,才能对People的属性做匹配。
内容的提问来源于stack exchange,提问作者Spring soup
相关产品推荐
相关产品推荐

