嘿,我创建了一个@Formula查询,它运行良好,但在添加了带有date_trunc+interval的行后,它就不再运行了。
@Formula("(SELECT SUM(sj.elapsed_time) " +
"FROM shift_job sj JOIN shift_service ss ON sj.shift_service_id = ss.id " +
"WHERE ss.monthly_service_group_service_id = id AND " +
"ss.status = 'scheduled' AND " +
"ss.create_time >= date_trunc('month', CURRENT_DATE) AND " +
"ss.create_time < date_trunc('month', CURRENT_DATE) + interval '1 month' " +
"GROUP BY sj.shift_service_id)")
private Long shiftJobsElapsedTimeThisMonth;
我发现创建的查询显示:
AND ss.create_time < date_trunc('month', CURRENT_DATE) + monthlyser12_.interval '1 month' GROUP BY sj.shift_service_id) as formula1_13_,
似乎它认为"interval"是我的实体(MonthlyServiceGroupService(中的一个字段,这把它搞砸了,我能以某种方式逃脱它吗?
这似乎是您的框架的一个问题。Postgres倾向于依赖interval
进行日期运算。但是有一个变通办法。您可以使用以下函数创建间隔:
ss.create_time < date_trunc('month', CURRENT_DATE) + make_interval(months => 1)
或:
ss.create_time < date_trunc('month', CURRENT_DATE) + make_interval(0, 1, 0)
Spring JPA框架中可能还有其他方法可以"关闭"这种行为——比如运行原始查询。但是,以上内容应该使您正在使用的函数的间隔是安全的。
我最终使用了它,它对我有效。
ss.create_time < date_trunc('month', CURRENT_DATE) + (1::text || ' month')::interval