【问题标题】:Jpa Hibernate @Query annotation with filters带有过滤器的 Jpa Hibernate @Query 注释
【发布时间】:2018-03-13 19:29:57
【问题描述】:

我有一个用于前端的基于 Angular 的应用程序和用于后端的 Spring Boot。

我的组件有一个包含类似过滤器的变量

search:any={ 
    name:'',
    surname:'',
    address:'',
    phone:'',
    city:''
  } 

我用这样的 Post 方法将它传递给我的 Api:

getPeoplesByFilters(filter){
    return this.http.post("http://localhost:8080/search", filter)
    .map (resp => resp.json())
  }

我通过这种方法在我的 Spring Boot 控制器中收到了这个:

@RequestMapping(value="/search", method= RequestMethod.POST )
     public Page<People> searchFilters(@RequestBody() People p, 
             @RequestParam(value="page", defaultValue="0") int page ,
             @RequestParam(value="size", defaultValue="5") int size){

        p.setName("%"+p.getName()+"%");
        p.setSurname("%"+p.getSurname()+"%");
        p.setAddress("%"+p.getAddress()+"%");
        p.setPhone("%"+p.getPhone()+"%");
        System.out.println(p.getName());
        return poepleRepository.searchFilters( p ,  new PageRequest(page, size));

     }

在我的 Jpa Repository 界面中,我有这个查询:

@Query("select p from poeple p where p.name like :#{#x.name} and p.surname like :#{#x.surname} and p.address like :#{#x.address} and p.phone like :#{#x.phone} and p.mobile like :#{#x.phone}")

public Page<People> searchFilters(@Param("x") People x, Pageable pageable);

但我没有任何结果

我只尝试了一个字段,然后将其填充到我的前端应用程序中,它可以工作 但是,当我只填写一个字段并让另一个字段为空时,我的结果为零。

怎么了!

谢谢

【问题讨论】:

  • 你确定SQL查询条件是AND而不是OR?
  • 是的,我想连接过滤器

标签: java spring hibernate spring-data-jpa jpql


【解决方案1】:

我以前的经验表明,使用规范最适合您的情况。因为它更具可扩展性和可理解性。您可以编写如下规范。

public class Spec{
    public static Specification<Person> filter(FilterParams filterParams) {
        return (root, query, cb) -> {
            List<Predicate> predicates = new ArrayList<>();
            if(filterParams.getName()!=null){
                predicates.add(cb.equal(root.get("name"),filterParams.getName()));
            }
            if(filterParams.getSurname()!=null){
                predicates.add(cb.equal(root.get("surname"),filterParams.getSurname()));
            }
            ....
            return cb.and(predicates.toArray(new Predicate[predicates.size()]));
        };
    }
   }
}

然后你可以像下面这样使用:

@Service
public TestService{
@Autowired
PersonRepository personRepository;

void test(){
 FilterParam filterParam = new FilterParam();
 filterParam.setName("test);
 ...
 personRepository.findAll(Spec.filter(filterParam));
 }

}

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多