【问题标题】:How to use Specification in JPA如何在 JPA 中使用规范
【发布时间】:2019-11-18 11:19:42
【问题描述】:

我正在我的应用程序中实现搜索功能。我在findAll() 中使用规范,它运行良好。但是,当我尝试使用 findByFirstName() 等其他方法时,它不起作用

我包括到目前为止我所做的事情。

AircraftSpecification.java

public class AircraftSpecification {

    private AircraftSpecification() {}

    public static Specification<Aircraft> textInAllColumns(String text) {

        if (!text.contains("%")) {
            text = "%"+text+"%";
        }
        final String finalText = text;

        return new Specification<Aircraft>() {
            private static final long serialVersionUID = 1L;

            @Override
            public Predicate toPredicate(Root<Aircraft> root, CriteriaQuery<?> cq, CriteriaBuilder builder) {
                  List<SingularAttribute<Aircraft, ?>> tempAttributes = new ArrayList<>();
                  for (SingularAttribute<Aircraft, ?> attribute : root.getModel().getDeclaredSingularAttributes()) {
                      if (attribute.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                          tempAttributes.add(attribute);
                      }
                  }

                  final Predicate[] predicates = new Predicate[tempAttributes.size()];

                  for (int i = 0; i < tempAttributes.size(); i++) {
                      predicates[i] = builder.like(builder.lower(root.get(tempAttributes.get(i).getName())), finalText.toLowerCase());
                  }
                  return builder.or(predicates);
              }
        };
    }
}

当我打电话时

aircraftRepository.findAll(Specification.where(AircraftSpecification.textInAllColumns(searchText)));

它给了我正确的数据。

但是当我打电话时

aircraftRepository.findAllByName(name, Specification.where(AircraftSpecification.textInAllColumns(searchText)));

它抛出异常。

例外是:

org.springframework.dao.InvalidDataAccessApiUsageException: At least 2 parameter(s) provided but only 1 parameter(s) present in query.; nested exception is java.lang.IllegalArgumentException: At least 2 parameter(s) provided but only 1 parameter(s) present in query.

谁能帮助我如何使用除 findAll 方法之外的规范。

【问题讨论】:

标签: java spring-data-jpa


【解决方案1】:

您不能将 Spring Data 从方法名称派生要执行的查询与 Specification 组合起来。 只需将查询的名称部分也设为Specification 并将两者与and 结合起来。

生成的调用可能如下所示或类似:

aircraftRepository.findAll(
        byName("Alfred")
       .and(textInAllColumns(searchText))
);

【讨论】:

  • 你能举个例子吗?这对我有很大帮助。谢谢
  • 不确定您在寻找什么。您已经知道如何创建Specification
猜你喜欢
  • 2020-01-14
  • 2021-11-12
  • 2022-11-21
  • 2017-06-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多