我有一个包含不同字段的实体,包括一个@ElementCollections列表:
@Entity
public class Property {
//different attributes
@ElementCollection
@Enumerated(EnumType.STRING)
protected List<PropertyCriteria> criterias = new ArrayList<>();
}
其中PropertyCriteria是一个简单的枚举类。
我想实现一个搜索方法,接收多个值,并返回相应的清单。
@GetMapping(value = "/search")
public Page<Property> search(
@RequestParam Map<String, String> filters,
@RequestParam(value = "criterias") List<PropertyCriteria> criterias,
Pageable pageable) {
return service.search(filters, criterias, pageable);
}
为了做到这一点,在我看来,规范是最好的方法,因为我将有其他属性进行过滤。criterias参数是一个列表,其中包含属性(ElementCollections)中所需的所有值。过滤器Map是一个键值参数,包含我收到的所有其他属性。我试过这样的东西,但它不工作:
public Page<Property> search(Map<String, String> filters, List<PropertyCriteria> criterias,
Pageable pageable) {
Specification<Property> specification = Specification
.where(criteriasFilter(criterias)
//.and(others specifications on other attributes)
;
return repository.findAll(specification, pageable);
}
public static Specification<Property> criteriasFilter(List<PropertyCriteria> criterias) {
Specification<Property> propertySpecification = (root, query, builder) -> {
query.distinct(true);
Predicate where = builder.conjunction();
return builder.and(where, root.joinList(Property_.CRITERIAS).in(
criterias));
};
return propertySpecification;
}
希望你们能帮助我:)非常感谢:)
您好
2条答案
按热度按时间km0tfn4u1#
如果需要所有条件都匹配,最好创建一个带有计数的子查询,并检查计数是否是预期的。就像这样:
8fq7wneg2#
在我的例子中,这个代码起作用了
我的实体是这样的
idIndicazione是包含要搜索的值的变量