所以我在Spring中使用PaginAndSortingRepository<>
。现在我有一个绑定到此存储库的对象。我们称之为AuditLogEntry
。所以我变成了PagingAndSortingRepository<AuditLogEntry, Long>
。我需要对此存储库应用一些过滤器,因此我创建了一个名为AuditLogEntryFilter
的新模型。这不是AuditLogEntry本身的约束,但是我想使用这个对象来过滤掉我的AuditLogEntry
。我自己想出的第一种方法是为每个过滤器属性设置方法,这些方法可以是不同的。当滤波器的尺寸扩大时,这变得非常复杂。我想做的是:
List<AuditLogEntry> filterByAuditLogEntryFilter(AuditLogEntryFilter filter);
有人知道如何做到这一点吗?我已经研究了PagingAndSortingRepository的实现,但是我必须实现所有其他方法。我不想这样做。
更新解决方案:
感谢@Nikolay Rusev,我想出了以下解决方案:
在我的控制器中,我这样调用我的存储库:
@RequestMapping(value = "/auditentries", method = RequestMethod.POST)
public String processFilter(final AuditLogEntryFilter filter, BindingResult bindingResult, ModelMap
modelMap, Pageable pageable) {
Page<AuditLogEntry> auditLogEntryPage = auditLogEntryRepository.findAll(auditLogEntryFilterSpec(filter), pageable);
modelMap.addAttribute("filter", filter);
return "audit";
}
然后我用大致以下代码制作了一个规范:
public static Specification<AuditLogEntry> auditLogEntryFilterSpec(AuditLogEntryFilter filter) {
return new Specification<AuditLogEntry>() {
@Override
public Predicate toPredicate(Root<AuditLogEntry> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicateList = new ArrayList<Predicate>();
if(filter.getDateFrom() != null || filter.getDateTo() != null) {
if(filter.getDateFrom() != null && filter.getDateTo() == null)
{
Predicate auditLogEntryFromDatePredicate = criteriaBuilder.greaterThan(root.get("timestamp"), filter.getDateFrom());
predicateList.add(auditLogEntryFromDatePredicate);
}
if(filter.getDateFrom() == null && filter.getDateTo() != null) {
Predicate auditLogEntryToDatePredicate = criteriaBuilder.lessThan(root.get("timestamp"), filter.getDateTo());
predicateList.add(auditLogEntryToDatePredicate);
}
if(filter.getDateFrom() != null && filter.getDateTo() != null) {
Predicate auditLogEntryFromDatePredicate = criteriaBuilder.greaterThan(root.get("timestamp"), filter.getDateFrom());
Predicate auditLogEntryToDatePredicate = criteriaBuilder.lessThan(root.get("timestamp"), filter.getDateTo());
predicateList.add(auditLogEntryFromDatePredicate);
predicateList.add(auditLogEntryToDatePredicate);
}
}
Predicate[] predicates = new Predicate[predicateList.size()];
predicateList.toArray(predicates);
return criteriaBuilder.and(predicates);
}
};
}
现在它根据过滤器检索正确的结果。
答案 0 :(得分:3)
您可能需要查看弹簧数据规格。这是spring文档:http://docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html#specifications
这里有一篇很好的文章:
希望有所帮助