Можно ли использовать аналитические функции в Hibernate? - PullRequest
14 голосов
/ 16 сентября 2008

Есть ли способ использовать sql-сервер как аналитические функции в Hibernate?

Что-то вроде

select foo from Foo foo where f.x = max(f.x) over (partition by f.y)

Ответы [ 3 ]

7 голосов
/ 16 сентября 2008

Вы после собственного запроса SQL.

Если вы используете JPA, синтаксис:

Query q = em.createNativeQuery("select foo.* from Foo foo " +
                               "where f.x = max(f.x) over " +
                               "(partition by f.y)", Foo.class);

Если вам нужно вернуть несколько типов, взгляните на аннотацию SQLResultSetMapping .

Если вы используете Hibernate API напрямую:

Query q = session.createSQLQuery("select {foo.*} from Foo foo " +
                                 "where f.x = max(f.x) over "+
                                 "(partition by f.y)");
q.addEntity("foo", Foo.class);

См. 10.4.4. Запросы в нативном SQL в документации Hibernate для получения более подробной информации.

В обоих API вы можете передавать параметры как обычно, используя setParameter.

4 голосов
/ 08 января 2010

Другой подход заключается в использовании сопоставления. Пожалуйста, смотрите эту статью: https://forums.hibernate.org/viewtopic.php?f=1&t=998482

Я против использования собственных запросов SQL в Hibernate ... вы теряете преимущества наличия сопоставления: -)

3 голосов
/ 08 октября 2015

Да, вы можете, но вам нужно расширить спящий диалект, как показано ниже:

import org.hibernate.dialect.Oracle10gDialect;

public class ExtendedDialect extends Oracle10gDialect{
    public ExtendedDialect()
    {
           super();
           registerKeyword("over");
           registerKeyword("partition");
    }
}

Когда этот класс окажется на вашем пути к классам, вам нужно будет указать hibernate использовать его вместо исходного диалекта (в данном случае Oracle10gDialect). Я не уверен, какие фреймворки вы используете, но в случае Spring вы можете использовать следующее свойство в LocalContainerEntityManagerFactoryBean:

        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="databasePlatform" value="path.to.dialect.ExtendedDialect" />
            </bean>
        </property>

Затем вы можете использовать перестановку и разбиение в аннотациях @Formula, аннотациях @Where и других функциях гибернации, не путая спящий режим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...