Спецификация CriteriaBuilder, конвертирующая ZonedDateTime в LocalDate для сравнения

0

Мне нужно сравнить, что сущность имеет дату, которая находится между двумя датами, к сожалению, я не получаю результаты, которые мне нужны. Вместо сравнения дат строитель критериев создал запрос, который сравнивает дату и время, в результате чего результаты не возвращаются. Я использую Spring Specification для вызова построителя критериев. Моя проблема в том, что я использую ZoneDateTime (мне нужно это), чтобы сравнивать даты, мне просто интересно, если там, если я там, я смогу преобразовать обе даты в LocalDate, чтобы вместо этого сравнить "2018-01-12" от "2018-01-12 09:45:00".

Строитель критериев:

 public static Specification<Activity> activityDateBetween(ZonedDateTime from, ZonedDateTime to) {
        return new Specification<Activity>() {
            @Override
            public Predicate toPredicate(Root<Activity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Predicate startingFrom =  criteriaBuilder.greaterThanOrEqualTo(root.get(Activity_.date), from);
                Predicate endingAt = criteriaBuilder.lessThanOrEqualTo(root.get(Activity_.date), to);
                return criteriaBuilder.and(startingFrom, endingAt);
            }
        };
    }

MySQL:

SELECT activity0_.id                  AS id1_5_, 
       activity0_.activity_type       AS activity2_5_, 
       activity0_.activity_date       AS activity3_5_, 
       activity0_.tracker_job_item_id AS tracker_5_5_, 
       activity0_.work_type           AS work_typ4_5_, 
       activity0_.tracker_worker_id   AS tracker_6_5_ 
FROM   tracker_job_item_activity activity0_ 
WHERE  activity0_.tracker_job_item_id = 71 
       AND ( activity0_.work_type IN ( 'BUTTONHOLING', 'SEWING', 'CUTTING' ) ) 
       AND ( activity0_.activity_type IN ( 'RECEIVE', 'SEND' ) ) 
       AND activity0_.activity_date >= '2018-01-12 09:29:43' 
       AND activity0_.activity_date <= '2018-01-12 09:29:43'

Как вы видите, приведенный выше запрос - это сравнение даты времени, которое не то, что я хочу.

  • 1
    ZonedDateTime.toLocalDate()
Теги:
spring
zoneddatetime

1 ответ

1
Лучший ответ

Хорошо, мне удалось получить результаты, которые я хочу, вычитая временную часть из ZonedDateTime. Теперь поиск включает текущую дату.

   public static Specification<Activity> activityDateBetween(ZonedDateTime from, ZonedDateTime to) {
            return new Specification<Activity>() {
                @Override
                public Predicate toPredicate(Root<Activity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    Predicate startingFrom =  criteriaBuilder.greaterThanOrEqualTo(root.get(Activity_.date),
                        from.minusHours(from.getHour()).minusMinutes(from.getMinute()).minusSeconds(from.getSecond()));
                    Predicate endingAt = criteriaBuilder.lessThanOrEqualTo(root.get(Activity_.date), to);
                    return criteriaBuilder.and(startingFrom, endingAt);
                }
            };
        }
  • 2
    Спасибо за размещение вашего решения. Если вы не можете заставить предложение sanit использовать .toLocalDate() , вы можете по крайней мере использовать from.truncatedTo(ChronoUnit.DAYS) . Это будет немного проще и менее подвержено ошибкам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню