【问题标题】:JPA Query Specification Date ComparatorJPA 查询规范日期比较器
【发布时间】:2020-11-23 11:42:47
【问题描述】:

我正在使用SpringBoot 2.2.6 和JPA,我想使用多个条件(带日期)进行查询。

只是为了尝试,我做了这样的事情(如在此处阅读):

@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
....
Path<Date> entityDate = root.get("dataInserimento");
java.util.Date from = null;
java.util.Date to = null;
java.sql.Date ff = null;
java.sql.Date tt = null;
        try {
            from = localeIta.parse("2000/10/10");
            to = localeIta.parse("2020/10/10");
            ff = new java.sql.Date(from.getTime());
            tt = new java.sql.Date(to.getTime());
        } catch (Exception e) {}
predicates.add(builder.between(entityDate, ff, tt));

但不起作用。如果我使用 java.util.Date 我会得到一个错误,即使我不使用 Path&lt;Date&gt; 来检索要面对的日期,我也会得到一个错误。

这样我在运行时没有错误但没有结果。

你能帮帮我吗? 谢谢

【问题讨论】:

    标签: spring-boot jpa specifications


    【解决方案1】:

    试试这个:

    Calendar calendar = Calendar.getInstance();
    calendar.set(2000, 10, 10, 00, 00, 00);
    java.util.Date fromDate = calendar.getTime();
    
    calendar.set(2020, 10, 10, 00, 00, 00);
    java.util.Date toDate = calendar.getTime();
    
    predicates.add(cb.between(root.get("dataInserimento"), fromDate, toDate));
    

    【讨论】:

      【解决方案2】:

      对不起,我在另一部分代码中错了,完整的代码是:

      @Getter
      @Setter
      public class SearchCriteria {
       private String key;
       private Object value;
       private SearchOperation operation;
      
       public SearchCriteria(String key, Object value, SearchOperation operation) {
          this.key = key;
          this.value = value;
          this.operation = operation;
       }
      }
      

      搜索操作Enum:

      public enum SearchOperation {
       GREATER_THAN,
       LESS_THAN,
       GREATER_THAN_EQUAL,
       LESS_THAN_EQUAL,
       NOT_EQUAL,
       EQUAL,
       MATCH,
       MATCH_END,
       BETWEEN_DATE,
       GREATER_THAN_DATE,
       LESS_THAN_DATE;
      }
      

      还有通用规范:

      public class GenericSpecification<T> implements Specification<T> {
      
       private SimpleDateFormat localeIta = new SimpleDateFormat("dd/MM/yyyy");
       private List<SearchCriteria> list;
      
       public GenericSpecification() {
          this.list = new ArrayList<>();
       }
      
       public void add(SearchCriteria criteria) {
          list.add(criteria);
       }
      
       @Override
       public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
          
          List<Predicate> predicates = new ArrayList<>();
          
          for (SearchCriteria criteria : list) {
          switch(criteria.getOperation()) {
          ....
          case BETWEEN_DATE: {
             Path<Date> entityDate = root.get(criteria.getKey());
             predicates.add(builder.between(entityDate, getComparingDates((String[])criteria.getValue(), 0), getComparingDates((String[])criteria.getValue(), 1)));
            }
          break; /** I FORGET THIS BREAK **/
          }
      
       private java.sql.Date getComparingDates(String[] dates, int order) {
          java.sql.Date result = null;
          try {
              if (order == 0) {
                  java.util.Date from = localeIta.parse(dates[0].toString());
                  result = new java.sql.Date(from.getTime());
              } else {
                  java.util.Date to = localeIta.parse(dates[1].toString());
                  result = new java.sql.Date(to.getTime());
              }
          } catch (ParseException e) {
              log.error(e.getMessage());
          }
          return result;
      }
        
      

      现在完美运行!谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-27
        • 2019-04-18
        • 2014-10-28
        • 1970-01-01
        • 2013-09-16
        • 2020-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多