Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring JPA/Hibernate本机查询(PostgreSQL)中的单引号参数值_Java_Hibernate_Postgresql_Jpa_Spring Data - Fatal编程技术网

Java Spring JPA/Hibernate本机查询(PostgreSQL)中的单引号参数值

Java Spring JPA/Hibernate本机查询(PostgreSQL)中的单引号参数值,java,hibernate,postgresql,jpa,spring-data,Java,Hibernate,Postgresql,Jpa,Spring Data,我有一个数据库,它将一个事件存储在一个“事件”表中,该事件的多个读数存储在一个“读取”表中,带有事件id的外键。事件本身有一个存储在UTC中的时间戳(带时区的时间戳)。然而,我有多个时区的用户,我想在用户的时区中总结某一天的读数 我能够使用本机查询成功检索给定日期(utc)的最大、最小和平均读数: @Query(nativeQuery=true, value="SELECT source, to_char(timestamp, 'yyyy-MM-dd') as \"date\", min(dec

我有一个数据库,它将一个事件存储在一个“事件”表中,该事件的多个读数存储在一个“读取”表中,带有事件id的外键。事件本身有一个存储在UTC中的时间戳(带时区的时间戳)。然而,我有多个时区的用户,我想在用户的时区中总结某一天的读数

我能够使用本机查询成功检索给定日期(utc)的最大、最小和平均读数:

@Query(nativeQuery=true, value="SELECT source, to_char(timestamp, 'yyyy-MM-dd') as \"date\", min(decimalreading), max(decimalreading), avg(decimalreading) " +
                "FROM reading, event " +
                "WHERE reading.event = event.id and source = ?1 "+
                "and timestamp between ?2 and ?3 "+
                "GROUP BY event.source, to_char(timestamp, 'yyyy-MM-dd') " +
                "ORDER BY source, to_char(timestamp, 'yyyy-MM-dd')")
List<Object[]> minMax(long source, Calendar from, Calendar to);
@Query(nativeQuery=true,value=“选择源,将字符(时间戳,'yyyy-MM-dd')作为\“日期\”,最小值(小数点)、最大值(小数点)、平均值(小数点)+
“从阅读,事件”+
“其中reading.event=event.id,source=?1”+
“时间戳介于?2和?3之间”+
“按event.source分组,到_char(时间戳'yyyy-MM-dd')”+
“按来源排序,至字符(时间戳'yyyy-MM-dd')”)
列出最小最大值(长源、日历起始、日历终止);
Postgres很好地支持“时区时间戳”语法,因此我尝试:

@Query(nativeQuery=true, value="SELECT source, to_char(timestamp at time zone ?4, 'yyyy-MM-dd') as \"date\", min(decimalreading), max(decimalreading), avg(decimalreading) " +
                "FROM reading, event " +
                "WHERE reading.event = event.id and source = ?1 " +
                "and timestamp at time zone ?4 between ?2 and ?3 "+
                "GROUP BY event.source, to_char(timestamp at time zone ?4, 'yyyy-MM-dd') " +
                "ORDER BY source, to_char(timestamp at time zone ?4, 'yyyy-MM-dd')")
List<Object[]> minMax(long source, Calendar from, Calendar to, String timezone);
@Query(nativeQuery=true,value=“选择源,将字符(时区的时间戳?4,'yyyy-MM-dd')作为\“日期\”、最小值(小数点)、最大值(小数点)、平均值(小数点)+
“从阅读,事件”+
“其中reading.event=event.id,source=?1”+
“时区4的时间戳介于?2和?3之间”+
“按event.source分组,到_char(时区的时间戳?4,'yyyy-MM-dd')”+
“按来源订购,至_char(时区的时间戳?4,'yyyy-MM-dd')”)
列出最小值(长源、日历起始、日历终止、字符串时区);
通过这个表单中的查询,我得到

event.timestamp必须出现在GROUP_BY子句中,或用于 聚合函数

调试Hibernate SQL时,查询显示为:

调试SQL:109-选择源,以_char(时区的时间戳?, “yyyy-MM-dd”)作为“日期”,最小值(十进制读数),最大值(十进制读数), 读取的平均值(小数点读取),其中reading.event=event.id 时区的时间戳呢?之间然后呢?按event.source分组, 按来源发送至_char(时区的时间戳?,'yyyy-MM-dd')订单, to_char(时区的时间戳?,'yyyy-MM-dd')

如果我用单引号(“?4”)括起?4,我得到

java.lang.IllegalArgumentException:具有该位置的参数[4] 不存在

很明显,这并没有更好的效果,而且它根本看不到查询中的参数

我也试过“4”和“4”,但没有更好的效果

如果我将?4位置参数替换为硬编码的值“cst5cdt”,则查询将成功执行。它还可以通过pgadmin中的sql提示符很好地执行

我怀疑这是预处理语句或位置参数处理方式的问题


是否有一种语法可以让我在作为参数传入的时区中聚合当天的数据?

我找到了一种方法,尽管有点复杂。选择时区作为子查询可以将其正确插入主查询:

@Query(nativeQuery=true, value="SELECT source, to_char(timestamp at time zone local.tz, 'yyyy-MM-dd') as \"date\", min(decimalreading), max(decimalreading), avg(decimalreading) " +
                "FROM reading, event, (select ?4 as tz) as local " +
                "WHERE reading.event = event.id "+
                "and source = ?1 " +
                "and timestamp at time zone local.tz between ?2 and ?3 "+
                "GROUP BY event.source, to_char(timestamp at time zone local.tz, 'yyyy-MM-dd') " +
                "ORDER BY well, to_char(timestamp at time zone local.tz, 'yyyy-MM-dd')")
List<Object[]> minMax(long source, Calendar from, Calendar to, String timezone);
@Query(nativeQuery=true,value=“选择源,将字符(时区local.tz的时间戳,'yyyy-MM-dd')作为\“日期\”,最小值(小数点)、最大值(小数点)、平均值(小数点)+
“从读取的事件中,(选择?4作为tz)作为本地”+
“其中reading.event=event.id”+
“和源=?1”+
“时区local.tz的时间戳介于?2和?3之间”+
“按event.source分组,到_char(时区local.tz的时间戳,'yyyy-MM-dd')”+
“按井订购,至_char(时区的时间戳local.tz,'yyyy-MM-dd')”)
列出最小值(长源、日历起始、日历终止、字符串时区);

有兴趣知道是否有其他方式可以减少。。。简陋。

是我遗漏了什么,还是您的方法在引用第五个参数时只接受4个参数?是的,这是因为我编辑了一些与问题不相关的信息,而且做得很糟糕。。。编辑了这个问题,谢谢你指出!