0

HQL を使用して、順序付けられたクエリ結果のインデックスを取得できますか?

これを行う唯一の方法は、データベースからすべての結果を取得し、すべての結果を反復処理することです。

たとえば、次のようになります。

<hibernate-mapping>
<class name="Dog" table="DOG">

    <id name="id" type="int" column="DOG_id">
        <meta attribute="scope-set">protected</meta>
        <generator class="native"/>
    </id>

    <property name="age" type="int" />

    <property name="name" type="string" />
</class>    
</hibernate-mapping>

次に、これらのタイプのクエリ:

//determine where dog with id 43 is in the current search results for dogs ordered by age
Query dogQuery = sess.createQuery("select d.id from Dog as d order by d.age");
List<Dog> dogList = dogQuery.list();
int idx = dogList.indexOf( 43 );

または、犬のリストをより絞り込んで検索します。

Query dogQuery = sess.createQuery("select d.id from Dog as d where (d.name='fluffy' OR d.age >= 3) order by d.age");
List<Dog> dogList = dogQuery.list();
int idx = dogList.indexOf( 43 );

ここでの欠点は、すべての dog.id をメモリにロードしていることです。

これが必要になるシナリオ:

  • 特定のクエリ結果 (何千もの) を行上のドットとして表示します。ラインとドットは、約 1 分ごとに更新されます。この視覚化により、検索クエリのランクが「リアルタイム」に更新されます
4

5 に答える 5

1

List.indexOf() を使用します リストが非常に大きい場合は、リストを「非常に怠惰」にします。

しかし、なぜインデックスが必要なのですか? 多分あなたは本当にそうではありません(したがって、この問題を解決する必要はありません)


修正された回答:

あなたはそれを完全に間違っています。あなたに必要なのは :

d.age <= d1.age および d1.id = :entityId および d1.id <> d.id である犬 d、犬 d1 から count(*) を選択します


なぜこれが機能するのか: このクエリは、問題の犬 (d1) と同じかそれより若いが、d1 ではないすべての犬を検索します。(しかし、実際にはそれらすべての犬を返すわけではありません - 私たちはそれらを気にしないので)。

カウントは、d1 の「前」の犬の数を示します。したがって、d1 が犬の完全なリストのどこに表示されるかがわかります。リスト内のすべての犬の位置を知る必要がないため、すべての犬を取得する必要はありません。

于 2009-02-13T06:46:56.120 に答える
0

このHQLから開始します(この場合は有効なSQLも):

select dog.id as dogId from canines dog order by dog.codename asc

わずかに変更して、有効なSQLクエリに挿入できます(rownum列を持つOracleの場合のみ)。

select rn from 
( select dogid dogId, rownum rn from canines dog order by dogname asc)
where dogid=206

残念ながら、これは有効なHQLではありません...

最初のHQLクエリを使用してそのSQLクエリと同じ情報を取得するには、次のことを計画しています。

  • hibernateにHQLクエリをSQLに生成させ、すべての結果のリストを作成するために使用します(うまくいけば、最初にクエリを実行しないでください)
  • この休止状態で生成されたSQLを、sessionObj.createSQLQueryを使用して新しいSQLクエリに挿入します。この新しいクエリは、上記の作業中のSQLのようになります。

これはクレイジーな解決策ですか?

-

ノート

特定の行のrownumを返すSQL?(Oracle dbを使用)

于 2009-02-10T23:50:51.990 に答える
0

Java List では、indexOf(Object) を呼び出すことができます。

APIについては一覧をご覧ください。

于 2009-02-09T14:42:53.837 に答える
0

Hibernates Criteria オブジェクトのようなものを使用して、クエリの小さなサブセクションを返すことができるはずです。

私の推測では、ページネーションを実装しようとしています。

Criteria criteria=session.createCriteria(Item.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(100);
criteria.setMaxResults(50);
List pageResults=criteria.list();

上記のコードは、http: //forum.springframework.org/archive/index.php/t-9658.htmlから削除されました。

これは、ページ要求ごとにこのクエリを実行する必要があるため、常に更新されるカタログでも機能します。

于 2009-02-13T17:55:06.000 に答える
0

結果のリスト全体をメモリにロードし、必要なものをフィルタリングするためだけにアプリケーション ロジックを使用することは、データベースとやり取りする方法として間違っています。

SQL WHERE 句と HAVING 句を使用して、最初に DB から必要なものを取得します。

于 2009-02-10T21:51:53.167 に答える