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()
,而无需编写语法验证实用程序