java - 规范 CriteriaBuilder 将 ZonedDateTime 转换为 LocalDate 以进行比较

标签 java mysql spring zoneddatetime

我需要比较一个实体的日期介于两个日期之间,遗憾的是我没有得到我需要的结果。标准构建器没有比较日期,而是创建了一个比较日期和时间的查询,这导致不返回任何结果。我正在使用 Spring 规范来调用标准生成器。我的问题是我正在使用 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'

正如您所看到的,上面的查询是比较日期时间,这不是我想要的。

最佳答案

好吧,我已经通过从 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);
                }
            };
        }

关于java - 规范 CriteriaBuilder 将 ZonedDateTime 转换为 LocalDate 以进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48217594/

相关文章:

mysql - 动态表达式 Groovy SQL 的引用

java - 违反参照完整性约束 - 添加超过 2 条记录时失败

java - 对话框中的Viewpager?

java - 将结果集中的对象添加到数组列表

java - 我应该在 `Thread.currentThread().interrupt()` 之前做 `throw new InterruptedIOException()` 吗?

php - 如何加速使用 Yii 2.0 框架开发的 Web 应用程序的性能

php - 由于 PHP 邮件程序,Mysql 插入两条记录,我的前端是 Android 应用程序

java - Spring Controller : Content-Type for StreamingResponseBody

java - 如何使用 Hibernate 保存具有相关空对象的实体

java - 为什么我的正则表达式在 RegexPlanet 和 regex101 上有效,但在我的代码中却无效?