【发布时间】: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 方法之外的规范。
【问题讨论】:
-
如果您添加您遇到的问题的例外,更多的人将能够(并且愿意)帮助您。查看如何添加Minimal, complete and reproducable example 和what to include in a good question。
-
@SamRockett 根据您的评论编辑。谢谢
标签: java spring-data-jpa