在JPA规范中比较日期和int与日期的比较

时间:2017-09-04 16:37:06

标签: 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(例如15)添加period字段(即日期)一定的分钟数,并将其与当前日期时间进行比较。我尝试这样做:

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(分钟 - &gt;毫秒)。如何解决这个问题?

我已经在@Серг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的毫秒数),它确实如此不行。

1 个答案:

答案 0 :(得分:2)

试试这个:

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