Spring仓库数据动态查询过滤器多参数

时间:2019-07-08 13:07:04

标签: spring spring-data-jpa spring-repositories

我有一个Entity类,其中包含5个参数,名称,家庭,电子邮件,地址,年龄。逐个或成组搜索这些内容应该是动态的。在这种情况下,如果我想独自编写,则会占用整个空间。如何向他们写入动态队列?

@Repository
public interface MyRepository extends JpaRepository<MyEntity1, Long> {
    Page<DirectTopup> findAllByName(Pageable pageable, String name);
    Page<DirectTopup> findAllByNameAndFamily(Pageable pageable, String name, , String family);
    Page<DirectTopup> findAllByNameAndFamilyAndEmail(Pageable pageable, String name, , String family, String email);

...

    Page<DirectTopup> findAllByNameAndFamilyAndEmail(Pageable pageable, String name, , String family, String email, String address, int age)

}

对于每个可能的呼叫,参数是Zer和Nal或根本没有。 请指教

if (name != null && family == null && email == null && address == null && age ==null){
myRepository.findAllByName(new PageRequest(page, size, direction, propertie), name);
}

if (name == null && family != null && email == null && address == null && age ==null){
    myRepository.findAllByFamily(new PageRequest(page, size, direction, propertie), family);
    }

...和所有参数

所有单独的值都分开。

    if (name != null && family != null && email != null && address == null && age ==null){
        myRepository.findAllByNameAndFamilyAndEmail(new PageRequest(page, size, direction, propertie), name, family, email);
        }
....

并组合它们(多个参数):

并且可能是参数的组合

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用规格界面。 浏览此link

一旦您通过上面的链接,然后使用此谓词 要动态过滤列,请使用以下谓词:

@Override
        public Predicate toPredicate(Root<MyEntity1> root, CriteriaQuery<?> query, CriteriaBuilder cb) 
        {
            List<Predicate> predicates = new ArrayList<Predicate>();


            if(StringUtils.isNotEmpty(name))
            {
                predicates.add(cb.like(cb.lower(root.get("name")), "%"+name.toLowerCase()+"%"));
            }

            if(StringUtils.isNotEmpty(family))
            {
                predicates.add(cb.like(cb.lower(root.get("family")), "%"+family.toLowerCase()+"%"));
            }

            return cb.and(predicates.toArray(new Predicate[] {}));
        }

example也将有所帮助。