104

HQLでDistinctクエリを作成する方法はありますか?「distinct」キーワードまたはその他の方法を使用します。DistinctがHQLの有効なキーワークであるかどうかはわかりませんが、SQLキーワード「distinct」に相当するHQLを探しています。

4

11 に答える 11

130

これは、使用する hql のスニペットです。(個人情報保護のため名前は変えてあります)

String queryString = "select distinct f from Foo f inner join foo.bars as b" +
                " where f.creationDate >= ? and f.creationDate < ? and b.bar = ?";
        return getHibernateTemplate().find(queryString, new Object[] {startDate, endDate, bar});
于 2008-11-04T23:25:10.730 に答える
60

HQL のキーワードは、SQLdistinctのキーワードに直接マップされないことに注意してください。distinct

distinctHQL でキーワードを使用する場合、Hibernate はdistinctSQL キーワードを使用することがありますが、場合によっては、結果トランスフォーマーを使用して明確な結果を生成します。たとえば、次のような外部結合を使用している場合:

select distinct o from Order o left join fetch o.lineItems

この場合、SQL レベルで重複を除外することはできないため、Hibernate はSQL クエリの実行ResultTransformerに a を使用して重複を除外します。

于 2008-11-23T22:38:11.247 に答える
16

次はこんなことして

 Criteria crit = (Criteria) session.
                  createCriteria(SomeClass.class).
                  setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

 List claz = crit.list();
于 2011-05-19T23:10:27.423 に答える
9

Criteria.DISTINCT_ROOT_ENTITYHibernate HQL クエリでも使用できます。

例:

Query query = getSession().createQuery("from java_pojo_name");
query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
return query.list();
于 2014-08-14T14:11:04.663 に答える
4

結果トランスフォーマーと HQL クエリを組み合わせると、いくつかの問題が発生しました。私が試したとき

final ResultTransformer trans = new DistinctRootEntityResultTransformer();
qry.setResultTransformer(trans);

うまくいきませんでした。次のように手動で変換する必要がありました。

final List found = trans.transformList(qry.list());

Criteria API トランスフォーマーを使用すると、問題なく動作しました。

于 2009-05-28T10:52:20.393 に答える
3

私の主なクエリは、モデルでは次のようになりました。

@NamedQuery(name = "getAllCentralFinancialAgencyAccountCd", 
    query = "select distinct i from CentralFinancialAgencyAccountCd i")

そして、私が「明確な」結果と考えていたものはまだ得られていませんでした。それらは、テーブルの主キーの組み合わせに基づいて区別されました。

そのためDaoImpl、1行の変更を追加し、最終的に必要な「明確な」リターンを取得しました。たとえば、00 を 4 回表示する代わりに、1 回だけ表示するようにします。に追加したコードは次のDaoImplとおりです。

@SuppressWarnings("unchecked")
public List<CacheModelBase> getAllCodes() {

    Session session = (Session) entityManager.getDelegate();
    org.hibernate.Query q = session.getNamedQuery("getAllCentralFinancialAgencyAccountCd");
    q.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); // This is the one line I had to add to make it do a more distinct query.
    List<CacheModelBase> codes;
    codes = q.list();
    return codes;       
}

これが役に立ったことを願っています!繰り返しますが、これは、プロジェクトのサービス、dao、およびモデル タイプを実装するコーディング プラクティスに従っている場合にのみ機能する可能性があります。

于 2014-11-03T18:25:09.507 に答える
2

CUSTOMER_INFORMATION テーブルにマップされた Customer エンティティがあり、顧客の個別の firstName のリストを取得したいとします。以下のスニペットを使用して同じものを取得できます。

Query distinctFirstName = session.createQuery("select ci.firstName from Customer ci group by ci.firstName");
Object [] firstNamesRows = distinctFirstName.list();

お役に立てば幸いです。したがって、ここでは、distinct キーワードを使用する代わりに group by を使用しています。

また、以前は、複数の列に適用したい場合に、distinct キーワードを使用するのが難しいことがわかりました。たとえば、個別の firstName、lastName のリストを取得したい場合は、グループ化するだけで機能します。この場合、distinct を使用するのは困難でした。

于 2015-05-12T14:53:28.390 に答える
1

Hibernate Query Language が Distinct フィールドを使用するための回答が得られました。*SELECT DISTINCT(TO_CITY) FROM FLIGHT_ROUTE* を使用できます。SQLクエリを使用すると、文字列リストが返されます。Entity Class による戻り値としては使用できません。したがって、そのタイプの問題を解決するための答えは、 SQLでHQLを使用することです。

FROM FLIGHT_ROUTE F WHERE F.ROUTE_ID IN (SELECT SF.ROUTE_ID FROM FLIGHT_ROUTE SF GROUP BY SF.TO_CITY);

SQLクエリ ステートメントからDISTINCT ROUTE_ID を取得し、リストとして入力します。そして、IN クエリは、IN (リスト) とは異なる TO_CITY をフィルター処理します。

戻り値の型はエンティティ Bean 型です。したがって、 AutoComplementなどの AJAX で実行できます。

無事でありますように

于 2013-02-22T13:22:17.887 に答える