Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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 在Oracle中使用JPA和按小时分组时出现问题_Java_Oracle_Jpa_Group By_Hour - Fatal编程技术网

Java 在Oracle中使用JPA和按小时分组时出现问题

Java 在Oracle中使用JPA和按小时分组时出现问题,java,oracle,jpa,group-by,hour,Java,Oracle,Jpa,Group By,Hour,我在Oracle中使用JPA和按小时分组时遇到问题。 以下是场景: 我有一个名为EventData的实体。此实体有一个名为startOfPeriod的java.util.Date字段。此字段映射到数据类型为DATE的表字段中。 我使用的查询类似于: select min(ed.startOfPeriod) as eventDate, (...) from Event e inner join e.eventDatas ed (...) group by year(ed.startOfPe

我在Oracle中使用JPA和按小时分组时遇到问题。 以下是场景: 我有一个名为EventData的实体。此实体有一个名为startOfPeriod的java.util.Date字段。此字段映射到数据类型为DATE的表字段中。 我使用的查询类似于:

select min(ed.startOfPeriod) as eventDate,
(...)
from
Event e inner join e.eventDatas ed
(...)
group by
    year(ed.startOfPeriod), 
    month(ed.startOfPeriod), 
    day(ed.startOfPeriod), 
    hour(ed.startOfPeriod) 
order by 1
如果我按“hour(ed.startOfPeriod)”删除组,它工作正常(它不会产生任何错误,但它不会做我想做的事情)。 当我插入此group by子句时,会出现以下例外情况:

Caused by: java.sql.SQLException: ORA-30076: campo de extração inválido para origem de extração
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:219)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:813)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1049)
at oracle.jdbc.driver.T4CPreparedStatement.executeMaybeDescribe(T4CPreparedStatement.java:854)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1154)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3370)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3415)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:92)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1812)
at org.hibernate.loader.Loader.doQuery(Loader.java:697)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
分析时,当“提取源不包含指定的提取字段”时发生。但是提取源(startOfPeriod字段)是数据类型DATE(它有一个小时部分)

同样的代码在SQLServer中也很有魅力

有人知道发生了什么吗


Tnhks

这不是一个很好的答案,但对我来说,这听起来像是一个驱动程序问题(尤其是在SQLServer上运行良好时)。您使用的Oracle驱动程序版本是什么?你试过不同的版本吗?

你试过用字符(d,'HH24')代替吗?您也可以将trunc()转换为小时…

我没有将所有的
日期
字段转换为
时间戳
字段。 相反,我扩展了Oracle的方言来重写
hour
函数

就像这样:

public class Oracle9Dialect extends org.hibernate.dialect.Oracle9Dialect
{
    public Oracle9Dialect()
    {
        super();
        registerFunction("hour", new SQLFunctionTemplate(Hibernate.INTEGER, "to_number(to_char(?1, 'hh24'))"));
    }
}
使用此方言(
org.hibernate.dialogue.dialogue
),
hour
函数将不使用ANSI
hour
函数(
extract(hour from)
)。它将改为使用
到字符(,'hh24')

糟糕的是它总是使用自定义函数(即使不需要使用它,比如使用
时间戳
字段)


这就是我为解决问题所做的。

嗯,我本想把它作为一个评论,但我没有代表,啊!我的oracle安装确实存在问题。如果我运行select:“select extract(从startofperiod开始的小时)from lum_moneventdata”,它会产生相同的错误。这样行吗?我使用的是10.2.0.4.0 ojdbc驱动程序。运行在Oracle 11g上。不确定,但11g有更多现代驱动程序,请参阅以了解详细信息。顺便说一句,在Sybase(15)上,您需要使用时间或日期时间数据类型,oracle文档似乎在这方面存在冲突(说日期存储小时,然后说要提取它,您需要使用时间戳)。这是我的知识范围,我担心我的解决方案会将我的字段从日期改为时间戳(虽然这对我来说没有意义)。听起来很合理,让我们知道你进展如何!问题是JPA实现(Hibernate)创建了查询。另一个问题是,这个项目不能是特定于BD的。只是一个更新,从lum_moneventdata中选择to_char(startofperiod,'hh24')。这个工作非常好,但是从lum_moneventdata中选择extract(startofperiod的小时)根本不起作用(这正是JPA impl所做的)。我的一个队友在Hibernate的Jira中打开了一个bug。它是: