如何在JPA中使用规范

时间:2019-06-25 14:43:28

标签: java spring-data-jpa

我正在应用程序中实现搜索功能。我在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方法之外,任何人都可以帮助我如何使用规范。

1 个答案:

答案 0 :(得分:1)

您无法合并派生查询,其中Spring Data派生查询以使用"WEBSITE_CONTENTAZUREFILECONNECTIONSTRING": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('keyVaultResourceId')).secretUriWithVersion, ')')]", 从方法名称执行。 只需将名称作为查询的一部分"keyVaultResourceId": "[resourceId(subscription().subscriptionId, parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('keyVaultName'))]" ,并将两者与and组合即可。

产生的呼叫可能看起来像这样或类似:

Specification