我正在使用Spring Boot构建一个休息服务。我一直在使用Spring Data JPA进行查询,但是我乐于接受任何有助于解决问题的方法。
我想在任何列中找到具有匹配字符串的数据库中的所有条目。
与FindAllBy(all 20 columns)(String parameter)
或SELECT * FROM AllColumns() WHERE parameter = "Foo";
相似的事物
我有一个具有接近20个属性的实体,所以我想避免在搜索中写所有列名称。
我该怎么办?
答案 0 :(得分:1)
此URL(https://www.baeldung.com/rest-api-search-language-spring-data-specifications)将为您提供帮助,我已从URL复制了一些代码来向您解释。
您需要定义一个条件类
public class SearchCriteria {
private String column;
private String operation;
private Object value;
}
然后,您需要定义搜索规范
public class SearchSpecification implements Specification<MyEntity> {
private SearchCriteria criteria;
private SearchSpecification(SearchCriteria criteria){
this.criteria =criteria;
}
@Override
public Predicate toPredicate
(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
if (criteria.getOperation().equalsIgnoreCase(":")) {
if (root.get(criteria.getColumn()).getJavaType() == String.class) {
return builder.like(
root.<String>get(criteria.getColumn()), "%" + criteria.getValue() + "%");
}
}
return null;
}
}
最后,您可以通过扩展JpaSpecificationExecuto r
来修改存储库public interface MyRepository
extends JpaRepository<User, Long>, JpaSpecificationExecutor<MyEntity> {}
现在您可以为您的案例创建全部二十列的规范
SearchSpecification spec1 =
new SearchSpecification(new SearchCriteria("column1", ":", "searchVal"));
SearchSpecification spec2 =
new SearchSpecification(new SearchCriteria("column2", ":", "searchVal"));
SearchSpecification spec3 =
new SearchSpecification(new SearchCriteria("column3", ":", "searchVal"));
然后您需要执行类似的查询
List<MyEntity> results =
repository.findAll(Specification.where(spec1).or(spec2).or(spec3));
答案 1 :(得分:0)
是在所有列中搜索字符串的唯一方法 选择*从yourTable 在哪里field1喜欢'%value%'或field2喜欢'%value%'......;