Spring JPA ExampleMatcher 比较日期条件

Tra*_*Tam 9 spring hibernate query-by-example hibernate-criteria spring-data-jpa

我正在使用 Spring JPA 并使用 Example Matcher 获取数据列表。源代码如下:

public Page<TranxLog> findAllByConditions(TranxReportFormModel formModel, Pageable page) {
        ExampleMatcher matcher = ExampleMatcher.matching()
                .withNullHandler(ExampleMatcher.NullHandler.IGNORE)
                .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
                .withIgnoreCase()
                .withIgnoreNullValues();
        Example<TranxLog> example = Example.of(formModel.getTranxLog(), matcher);
        return tranxlogRepository.findAll(example, page);
    }
Run Code Online (Sandbox Code Playgroud)

现在,我的搜索页面,其中有formDatetoDate它有与现场相比较DateTimeTranxLog。我尝试使用.withMatcher()但找不到比较日期的方法。

任何的想法?谢谢。

小智 6

您也可以从 JpaSpecificationExecutor 扩展,并从 Example 中使用 QueryByExamplePredicateBuilder 获取 Predicate。

在您的存储库中:

public interface TranxlogRepository extends JpaRepository<Tranxlog, Long>, JpaSpecificationExecutor<Tranxlog>{ 
}
Run Code Online (Sandbox Code Playgroud)

在您的服务Imp

public Specification<TranxLog> getSpecFromDatesAndExample(
  LocalDateTime from, LocalDateTime to, Example<TranxLog> example) {

    return (Specification<TranxLog>) (root, query, builder) -> {
         final List<Predicate> predicates = new ArrayList<>();

         if (from != null) {
            predicates.add(builder.greaterThan(root.get("dateField"), from));
         }
         if (to != null) {
            predicates.add(builder.lessThan(root.get("dateField"), to));
         }
         predicates.add(QueryByExamplePredicateBuilder.getPredicate(root, builder, example));

         return builder.and(predicates.toArray(new Predicate[predicates.size()]));
    }
};
Run Code Online (Sandbox Code Playgroud)

在您的 serviceImp 中也是:

public Page<TranxLog> findAllByConditions(TranxReportFormModel formModel, Pageable page) {
    ExampleMatcher matcher = ExampleMatcher.matching()
            .withNullHandler(ExampleMatcher.NullHandler.IGNORE)
            .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING)
            .withIgnoreCase()
            .withIgnoreNullValues();
    Example<TranxLog> example = Example.of(formModel.getTranxLog(), matcher);
    return tranxlogRepository.findAll(getSpecFromDatesAndExample(from, to, Example.of(formModel.getTranxLog(), matcher)), page);
}
Run Code Online (Sandbox Code Playgroud)


Jen*_*der 3

您无法通过示例查询来做到这一点。也许最好的办法是构建一个Specification