Компаратор даты спецификации запроса JPA - PullRequest
0 голосов
/ 03 августа 2020

Я использую 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<Date> для получения даты для конфронтации, я получаю сообщение об ошибке.

Таким образом, у меня нет ошибки во время выполнения, но нет результата .

Вы можете мне помочь? Спасибо

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Извините, ребята, я ошибся в другой части кода, полный код:

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

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

И GenericSpecification:

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

Теперь отлично работает! Спасибо

0 голосов
/ 03 августа 2020

попробуйте это:

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