java - 将 date 和 int 的数量与 JPA 规范中的 date 进行比较

标签 java spring jpa spring-data spring-data-jpa

我有包含以下字段的实体事件:

@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = DATE_FORMAT)
private Date start;

@Column(name = "period_minutes")
private Integer period;

我需要将这些字段的数量与当前日期时间进行比较:

SELECT * FROM Event e WHERE (e.start + e.period) < NOW();

换句话说,我需要向 start 字段(即日期)添加距 period 一定的分钟数(例如 15),并将其与当前日期时间进行比较。我尝试这样做:

return (root, query, cb) -> {
    Expression<Long> sum = cb.sum(root.<Date>get("start"), root.get("period"));
    return cb.lessThan(sum, new Date());
};

但这不能编译。我不知道如何将日期转换为长日期并添加 period * 60 * 1000 (分钟 -> 毫秒)。如何解决这个问题?

解决方案

我在@Серг0的帮助下解决了这个问题

cb.lessThan(
    cb.sum(
        cb.function("unix_timestamp", Long.class, root.get("start")),
        cb.prod(root.get("period"), 1L)
        ),
    cb.function("unix_timestamp", Long.class, cb.function("now", Long.class))
);

但我不明白为什么如果我使用 1L 它会起作用,如果我使用 60L*1000L (因为我需要计算 period 的毫秒数 这在几分钟内)它不起作用。

最佳答案

试试这个:

Specification<Event> predicate = (root, query, cb) -> {

    Expression<Time> currentTime = cb.currentTime();

    return cb.and(
        cb.equal(root.get("start"), cb.currentDate()), // if start date == current date
        cb.lessThan( // if period < current hour * 60 + current minutes
            root.get("period"), 
            cb.sum( // current hour * 60 + current minutes
                cb.prod(cb.function("hour", Integer.class, currentTime), 60), // hours * 60
                cb.function("minute", Integer.class, currentTime) // current minutes
            )
        )
    );
};

List<Event> events = findAll(predicate);

其他信息:

Criteria Query Arithmetic Expressions

Date and Time in Criteria Queries

关于java - 将 date 和 int 的数量与 JPA 规范中的 date 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041207/

相关文章:

java - 为什么在 Spring Data JPA Repository 上的 save() 之后使用返回的实例?

java - Spring jpa criteriaBuilder 在列表中搜索

java - 如何在静态方法中将 ActionLister 添加到按钮

java - 使用 Comparable 按 2 个字段比较两个对象 ASC 和 DESC

java - Spring Boot JWT身份验证: trigger a method after login and logout

java - 使用 DAO 执行简单的 Struts 应用程序

java - 如何使我的 ArrayList 线程安全? Java中解决问题的另一种方法?

java - 错误 400——错误请求

java - 数据库表中的 Quartz 作业

java - 增量或序列代替表生成 JPA