我有包含以下字段的实体事件:
@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);
其他信息:
关于java - 将 date 和 int 的数量与 JPA 规范中的 date 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46041207/