使用对象

时间:2015-06-09 09:16:31

标签: spring spring-mvc

所以我在Spring中使用PaginAndSortingRepository<>。现在我有一个绑定到此存储库的对象。我们称之为AuditLogEntry。所以我变成了PagingAndSortingRepository<AuditLogEntry, Long>。我需要对此存储库应用一些过滤器,因此我创建了一个名为AuditLogEntryFilter的新模型。这不是AuditLogEntry本身的约束,但是我想使用这个对象来过滤掉我的AuditLogEntry。我自己想出的第一种方法是为每个过滤器属性设置方法,这些方法可以是不同的。当滤波器的尺寸扩大时,这变得非常复杂。我想做的是:

List<AuditLogEntry> filterByAuditLogEntryFilter(AuditLogEntryFilter filter);

有人知道如何做到这一点吗?我已经研究了PagingAndSortingRepository的实现,但是我必须实现所有其他方法。我不想这样做。

更新解决方案:

感谢@Nikolay Rusev,我想出了以下解决方案:

  1. 在我的控制器中,我这样调用我的存储库:

    @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";
    
    }
    
  2. 然后我用大致以下代码制作了一个规范:

    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);
            }
        };
    }
    
  3. 现在它根据过滤器检索正确的结果。