Postgresql 如何使用Hibernate查询间隔列表?
我需要创建一个持续时间介于两个时间戳之间的时隙Postgresql 如何使用Hibernate查询间隔列表?,postgresql,hibernate,jpa,hql,Postgresql,Hibernate,Jpa,Hql,我需要创建一个持续时间介于两个时间戳之间的时隙 SELECT t::time as appointmenttime FROM generate_series( timestamp '2016-11-09 08:00 AM', timestamp '2016-11-09 03:00 PM', INTERVAL '10 minutes' ) t ; 我在本机查询中尝试了此查询 String sql = "SELECT t:
SELECT t::time as appointmenttime
FROM generate_series(
timestamp '2016-11-09 08:00 AM',
timestamp '2016-11-09 03:00 PM',
INTERVAL '10 minutes'
) t ;
我在本机查询中尝试了此查询
String sql = "SELECT t::time as appointmenttime "
+ " FROM generate_series(timestamp :startTime,timestamp :endTime, INTERVAL :duration ) t ";
NativeQuery nativeQuery = session.createNativeQuery(sql);
nativeQuery.setParameter("startTime", "09:00:00");
nativeQuery.setParameter("endTime", "18:00:00");
nativeQuery.setParameter("duration", "10");
但在控制台中,我遇到了一个问题:
SELECT t:time as appointmenttime FROM generate_series(timestamp ?,timestamp ?, INTERVAL ? ) t
如何在本机查询中创建此查询。(为什么缺少一个?)提前感谢。免责声明:我没有JPA方面的经验,但由于本机查询应该是“普通”JDBC,因此我将尝试: 在参数化SQL中,不需要
时间戳
关键字。仅当后跟字符串常量时才需要。通过在interval
关键字前加前缀,从参数构建间隔也不起作用
以下方面应起作用:
SELECT t::time as appointmenttime
FROM generate_series(:startTime, :endTime, make_interval(mins => :duration) t
如果JPA阻塞=>
运算符,则需要传递位置参数:
make_interval(0, 0, 0, 0, 0, :duration)
请注意,Java代码需要传递有效的时间戳值,而不是时间或字符串值。我假设它应该是
LocalDateTime
的一个实例,或者可能是OffsetDateTime
——我不希望在这里使用字符串值(但我也不知道JPA是如何使用它的)此时PostgreSQL JDBC驱动程序无法将值设置为interval。使用时间戳?
或间隔?
是语法错误
通常情况下,您想要的语法结果如下:
SELECT t:time as appointmenttime FROM generate_series(?,?, ? ) t
在PreparedStatement
上调用setTimestamp
时,将前两个参数设置为timestamp。然而,我最近跟踪了PGJDBC驱动程序的代码,以确定它是否受支持,事实上,无法调用它来设置间隔
值,因为它是一个未完成的功能。您可以改为手动验证间隔字符串,并将其按字面意思插入查询中:
String validInterval = SomeUtil.toSqlInterval(duration);
String sql = "SELECT t::time as appointmenttime "
+ " FROM generate_series(:startTime , :endTime, INTERVAL '" + validInterval + "' ) t ";
PostgreSQL支持ISO-8601 interval格式,因此,如果您使用的是java.time.Duration
对象,则只需对其调用toString()
,而无需编写语法验证实用程序