Hibernate で分析関数のような sql-server を使用する方法はありますか?
何かのようなもの
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アノテーションを参照してください。
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を参照してください。詳細については、Hibernate ドキュメントのネイティブ SQL でのクエリを参照してください。
両方の API で、setParameter を使用して通常どおりパラメーターを渡すことができます。
別のアプローチは、マッピングを使用することです。この記事を参照してください: https://forums.hibernate.org/viewtopic.php?f=1&t=998482
私は Hibernate でのネイティブ SQL クエリの使用に反対しています... マッピングを持つ利点を失います :-)
はい、できますが、次のように休止状態の方言を拡張する必要があります。
org.hibernate.dialect.Oracle10gDialect をインポートします。
public class ExtendedDialect extends Oracle10gDialect{
public ExtendedDialect()
{
super();
registerKeyword("over");
registerKeyword("partition");
}
}
このクラスがクラスパスに追加されたら、元のダイアレクト (この場合は Oracle10gDialect) の代わりにそれを使用するように hibernate に指示する必要があります。どのフレームワークを使用しているかわかりませんが、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 アノテーション、およびその他の休止状態機能で over および partition を使用できます。