Spring JPA ExampleMatcher比较日期条件

标签 spring hibernate spring-data-jpa hibernate-criteria query-by-example

我正在使用Spring JPA,并通过使用示例匹配器获取数据列表。
源代码如下:

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);
    }

现在,我有了搜索页面,其中包含formDatetoDate,必须将其与DateTime中的字段TranxLog进行比较。
我尝试使用.withMatcher(),但找不到比较日期的方法。

任何想法?谢谢。

最佳答案

您也可以从JpaSpecificationExecutor进行扩展,并从Example中获取带有QueryByExamplePredicateBuilder的谓词。

在您的存储库中:

public interface TranxlogRepository extends JpaRepository<Tranxlog, Long>, JpaSpecificationExecutor<Tranxlog>{ 
}

为您服务
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()]));
    }
};

在您的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);
}

关于Spring JPA ExampleMatcher比较日期条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45973070/

相关文章:

mysql - 如何选择多个表 Spring Data JPA/Jhipster

java - spring 中不同事务管理器的嵌套事务

spring - 为什么 Spring 在 Authentication 和 UserDetails 中有重复字段?

java - 我尝试使用 hibernate 连接到 MySql 工作台

java.sql.SQLIntegrityConstraintViolationException : Column 'library_idlibrary' cannot be null

sql - JPA batch_size 属性不适用于 native 查询

java - Spring 数据 JPA : How to execute aggregate functions

java - Spring Data JPA 仅在创建之前在数据库端生成 id

java - GET参数的SpringMVC RequestMapping

java - keep-alive 是否始终在使用 httpclient 的请求中发送以及如何防止发送它