我有以下字段的实体事件:
@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
的毫秒数),它确实如此不行。
答案 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);
其他信息: