Есть ли способ использовать sql-сервер, например аналитические функции в Hibernate?Можно ли использовать аналитические функции в Hibernate?
Что-то вроде
select foo from Foo foo where f.x = max(f.x) over (partition by f.y)
Есть ли способ использовать sql-сервер, например аналитические функции в Hibernate?Можно ли использовать аналитические функции в Hibernate?
Что-то вроде
select foo from Foo foo where f.x = max(f.x) over (partition by f.y)
Вы после нативного запроса 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 аннотацию.
Если вы используете в API Hibernate непосредственно:
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. Queries in native SQL в документации Hibernate для получения более подробной информации.
В обоих API-интерфейсах вы можете передавать параметры, как обычно, с помощью setParameter.
Спасибо, но это что-то, что можно сделать непосредственно в Hibernate? – ncgz 2008-09-17 21:25:31
Другим подходом было бы использовать отображение. Пожалуйста, обратитесь к этой статье: https://forums.hibernate.org/viewtopic.php?f=1&t=998482
Я против использования нативных запросов SQL в Hibernate ... вы теряете преимущество наличия картирования :-)
Да вы можете, но вам нужно будет продлить диалект спящего режима:
import org.hibernate.dialect.Oracle10gDialect;
public class ExtendedDialect extends Oracle10gDialect{
public ExtendedDialect()
{
super();
registerKeyword("over");
registerKeyword("partition");
}
}
После того, как этот класс находится на вашем пути к классам, вам нужно будет сказать спящий режим, чтобы использовать его вместо оригинального диалекте (в данном случае 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 аннотации и другие функции гибернации, не запутывающие спящий режим.
Педантизм: аналитический – GEOCHET 2008-09-16 16:14:09