Проблема с использованием JPA с Oracle и группировка по часам - PullRequest
3 голосов
/ 01 октября 2010

У меня проблема с использованием JPA с Oracle и группировкой по часам.Вот сценарий: у меня есть запись с именем EventData.Эта сущность имеет поле java.util.Date с именем startOfPeriod.Это поле отображается в поле таблицы типа данных 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

Если я удаляю группу с помощью «часа (ed.startOfPeriod)», он работает нормально (не выдает никаких ошибок, но не делаетчто я хочу).Когда я вставляю эту группу по предложению, она делает следующее исключение:

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 (который имеет часовую часть).

Тот же код работает как чудо в SQL Server.

Каждый знает, что происходитвкл?

тнхкс!

Ответы [ 3 ]

2 голосов
/ 01 октября 2010

Вы пробовали TO_CHAR (d, 'HH24') вместо этого? Вы также можете усечь () до часов ...

0 голосов
/ 04 октября 2010

Я не преобразовал все свои DATE поля в 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 не будет использовать функцию ANSI hour (extract(hour from <FIELD>)). Вместо этого будет использоваться to_number(to_char(<FIELD>, 'hh24')).

Плохо то, что он всегда использует пользовательскую функцию (даже если ее не нужно использовать, например, с полем TIMESTAMP).

Это то, что я сделал, чтобы решить мою проблему.

0 голосов
/ 01 октября 2010

Не совсем ответ, но это звучит подозрительно, как проблема с драйвером для меня (особенно, поскольку это прекрасно работает на SQLServer). Какую версию драйвера Oracle вы используете? Вы пробовали разные версии?

...