如何使用JPA Criteria API过滤实体的@OneToMany关联关系?
JPA Specification过滤@OneToMany关联实体问题
场景概述
- Parent实体包含5个关联关系,使用
JpaRepository.findAll(Specification<Parent> spec)方法进行过滤,已完成其中3个关联关系的过滤逻辑 - 剩余两个单向@OneToMany关联:
List<Child> name和List<Child> description,每个Parent对应指定Language的Child实例唯一 - 需求:过滤后返回的Parent列表中,每个Parent仅保留对应Language的1个name和1个description,当前先聚焦处理
List<Child> name
首次实现代码及问题
以下是首次编写的Specification代码:
private Specification<Parent> createSpecifications(SearchCriteria searchCritera) { Specification<Parent> specification = findaAllServices(); specification = specification.and(filterOne(searchCritera.getFilterOne())); specification = specification.and(filterTwo(searchCritera.getFilterTwo())); specification = specification.and(filterThree(searchCritera.getFilterThree())); return specification.and(filterTranslations(searchCriteria.getLanguage())); } private Specification<Parent> filterTranslations(String language) { return (root, query, builder) -> { return builder.equal(root.join(Parent_.CHILD).get(Child_.LANGUAGE), language); }; }
原本预期该代码能实现过滤,但实际执行后数据库查询无变化,过滤逻辑未生效。尝试改为双向关联等方案后,问题仍未解决。
子查询尝试及异常
尝试用子查询实现过滤,代码如下:
Subquery<Child> subquery = query.subquery(Child.class); Root<Child> childRoot = subquery.from(Child.class); subquery.select(childRoot).where(builder.equal(childRoot.get(Child_.LOCALE_CD), language)); return subquery.in(query);
执行后报错:SqlNode的文本未引用预期数量的列。修改返回语句为return builder.equal(childRoot.get(Child_.LOCALE_CD), language);后,错误消失,但过滤效果依然不存在。
其他尝试
尝试使用Join On方式实现过滤,同样无效果,目前无法找到有效解决方案。
内容的提问来源于stack exchange,提问作者rbrewster
相关产品推荐
相关产品推荐

