简体   繁体   English

Spring Data JPA规范调用

[英]Spring Data JPA Specifications Calling

I followed this tutorial to get Spring Data JPA Specifications: https://dzone.com/articles/using-spring-data-jpa-specification 我按照本教程获取Spring Data JPA规范: https//dzone.com/articles/using-spring-data-jpa-specification

It worked to implement that for me, but I can't call the specifications methods to search for them. 它为我实现了这一目标,但是我无法调用规范方法来搜索它们。 I want to have them in my SearchController: 我想将它们放入我的SearchController中:

这是项目 Code: TelefonbuchSpecifications: 代码:Telefonbuch规格:

public static Specification<Telefonbuch> hasVorname(String vorname) {
    return (root, query, cb) -> {
        return cb.equal(root.get(Telefonbuch_.vorname), "%"+vorname.toLowerCase()+"%");
    };
}

And now I want to call this method in my SearchController (SucheController), but I don't know how. 现在,我想在我的SearchController(zhiController)中调用此方法,但是我不知道如何。 At the moment the method looks like this: SucheController: 目前,该方法如下所示:

   public void search(String vorname, String nachname, String telefonnummer, String handynummer) {  
    telefonbuch.setVorname(vorname);
    telefonbuch.setNachname(nachname);
    telefonbuch.setTelefonnummer(telefonnummer);
    telefonbuch.setHandynummer(handynummer);

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<Telefonbuch> query = builder.createQuery(Telefonbuch.class);
    Root<Telefonbuch> root = query.from(Telefonbuch.class);
    List<Predicate> predicates = new ArrayList<Predicate>();



    if (!vorname.isEmpty()) {   
        //eintraege = telefonbuchRepository.findAll(hasVorname()); -> does not work
        Predicate condition = builder.like(builder.lower(root.get(Telefonbuch_.vorname)), "%"+vorname.toLowerCase()+"%");
        predicates.add(condition);
    }
...
query.select(root).where(predicates.toArray(new Predicate[predicates.size()]));

You need to have aa TelefonbuchRepository interface which implements JpaRepository and JpaSpecificationExecutor . 您需要有一个实现JpaRepositoryJpaSpecificationExecutor TelefonbuchRepository接口。 The latter gives you methods, to which you can pass your Specification : 后者为您提供方法,您可以将Specification传递给该方法:

 - long     count(Specification<T> spec) 
 - List<T>  findAll(Specification<T> spec) 
 - Page<T>  findAll(Specification<T> spec, Pageable pageable)
 - List<T>  findAll(Specification<T> spec, Sort sort) 
 - Optional<T> findOne(Specification<T> spec)

Edit: MySpecification: 编辑:MySpecification:

public class MyEntitySpecification implements Specification<MyEntity> {

   private final String searchText;

   public MyEntitySpecification(String searchText) {
      this.searchText = searchText;
   }

   @Override
   public Predicate toPredicate(Root<MyEntity> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
      List<Predicate> predicates = new ArrayList<>();
      Optional.ofNullable(searchText).ifPresent(
         s -> predicates.add(cb.like(cb.lower(root.get(MyEntity_.searchString)), "%" + s.toLowerCase() + "%"))
      );
      return cb.and(predicates.toArray(new Predicate[predicates.size()]));
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM