[英]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
. 您需要有一个实现JpaRepository
和JpaSpecificationExecutor
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.