3

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)」でグループを削除すると、正常に機能します(エラーは発生しませんが、必要な処理は実行されません)。このgroupby句を挿入すると、次の例外が発生します。

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(1時間の部分)です。

同じコードがSQLServerの魅力のように機能します。

誰もが何が起こっているのか知っていますか?

Tnhks!

4

3 に答える 3

2

代わりに TO_CHAR(d, 'HH24') を試しましたか? また、数時間に trunc() することもできます...

于 2010-10-01T13:02:09.207 に答える
0

DATEすべてのフィールドを1つに変換しませんでしTIMESTAMPた。代わりに、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.dialect.Dialect)を使用すると、hour関数はANSIhour関数(extract(hour from <FIELD>))を使用しません。代わりに使用to_number(to_char(<FIELD>, 'hh24'))します。

悪い点は、常にカスタム関数を使用することです(フィールドのように使用する必要がない場合でもTIMESTAMP)。

これが私の問題を解決するために私がしたことです。

于 2010-10-04T14:15:52.733 に答える
0

完全な答えではありませんが、ドライバーの問題のように思えます (特に、これは SQLServer で正常に動作するため)。使用している Oracle ドライバーのバージョンは何ですか? さまざまなバージョンを試しましたか?

于 2010-10-01T12:10:57.883 に答える