15

Hibernate で分析関数のような sql-server を使用する方法はありますか?

何かのようなもの

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

3 に答える 3

8

あなたはネイティブ 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 を使用して通常どおりパラメーターを渡すことができます。

于 2008-09-16T18:13:00.877 に答える
4

別のアプローチは、マッピングを使用することです。この記事を参照してください: https://forums.hibernate.org/viewtopic.php?f=1&t=998482

私は Hibernate でのネイティブ SQL クエリの使用に反対しています... マッピングを持つ利点を失います :-)

于 2010-01-08T13:22:08.523 に答える
3

はい、できますが、次のように休止状態の方言を拡張する必要があります。

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 を使用できます。

于 2015-10-07T22:23:39.727 に答える