我按照本教程获得了Spring Data JPA规范:https://dzone.com/articles/using-spring-data-jpa-specification
它为我实现了这一点,但我不能调用规范方法来搜索它们。我想把它们放在我的SearchController中:
public static Specification<Telefonbuch> hasVorname(String vorname) {
return (root, query, cb) -> {
return cb.equal(root.get(Telefonbuch_.vorname), "%"+vorname.toLowerCase()+"%");
};
}
现在我想在我的SearchController(比如Controller)中调用这个方法,但我不知道如何调用。目前,该方法如下所示: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()]));
您需要有一个Telefonbuch存储库接口,它实现JpaRepository
和JpaSpecificationExecutor
。后者为您提供了方法,您可以将规范
传递给这些方法:
- 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)
编辑:我的规范:
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()]));
}
}
我在Spring Data JPA中有两个实体: 目标是获取与user\u id相关的所有税款: User.java 税务ayment.jva 我不想要一个太多的注释从User.java和列映射在纳税user_id。 规格等级如下: 根据我获取所有与user\u id相关的税款的目标,规范是正确的还是错误的?
我不能同时使用Spring Data,JPA投影和规范。我有以下设置: 实体: 投影界面: 国家规格: 存储库: 前两个方法findByName和findAllProjectedBy工作良好。而第三个方法findAllProjectedBy(Specification Specification)抛出以下异常- 如何才能做到这一点呢?有什么想法吗?
有一个使用属性表达式的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式: 试图通过规范执行查询: 我得到了一个错误: 我做错了什么或忘记添加了什么? 查询:按教师姓名显示所有学生 基地实体: 实体教师: 实体学生: 实体教室: 实体教室:
在spring-date-jpa中,当我的规范包含query.distinct(true)时,我看到count(specification)方法,count查询是不正确的。生成的SQL如下所示: 选择distinctcount(*)...
如果有一种方法我可以用JPA做到这一点,请帮助我! 提前致谢
现在挣扎着与first存在,因为它已经加入了。有没有办法用规范来做到这一点。也因为有两个存在,这是否意味着我需要两个规范。我能在一个规范中实现它吗。