4 回答
TA贡献1777条经验 获得超3个赞
您可以使用规范来实现这一目标。规范类类似于(假设 a、b 是文本列):
public class LocationSpecification implements Specification<Location> {
public LocationSpecification(final List<String> listA, final List<String> listB) {
this.listA = listA;
this.listB = listB;
}
private final List<String> listA;
private final List<String> listB;
@Override
public Predicate toPredicate(Root<Location> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if (listA != null) {
predicates.add(root.<String>get("a").in(listA));
}
if (listB != null) {
predicates.add(root.<String>get("b").in(listB));
}
return cb.and(predicates.toArray(new Predicate[0]));
}
}
存储库需要扩展JpaSpecificationExecutor
public interface LocationRepository extends JpaRepository<Location, Long>, JpaSpecificationExecutor<Location> {}
你会这样称呼它:
List<Location> results = repository.findAll(new LocationSpecification(listA, listB));
PS 上面写的是我的头顶,可能需要一些修改。
TA贡献1821条经验 获得超4个赞
在Criteria API / Specifications / Querydsl之间有一个很好的概述/比较。另一个库是Jooq,它有免费版本。
解决问题的方法是使用其中之一。
我更喜欢 Querydsl 因为
它是类型安全的
它与 Spring Data 配合良好
您可以使用 IDE 中的代码完成功能
您还应该考虑到(目前)Querydsl 维护得不好。
添加回答
举报