4

私は使用していて、クエリの最初の結果が必要なだけなので、 in のDetachedCriteriaようなことをしたい. 私がグーグルを検索したとき、私は見つけましたが、その基準です。LIMIT 1DetachedCriteriasetMaxResult

でどうやってやるのDetachedCriteria

4

3 に答える 3

2

私もちょうどこれを調べていました。DetachedCriteria のこの全体的な目的は、セッションがまだないときに定義されることであるため、基準を使用する必要があるという解決策は好きではありません。私が取り組んでいるアプリケーションでは、これもオプションではありません。DetachedCriteria が作成される場所は、実際に実行される場所にはほど遠いからです。

とにかく、DetachedCriteria を作成するときに、この巧妙なトリックを使用して制限を定義できることがわかりました。DetachedCriteria は Criterion インスタンスを取りますが、Criterion は実際の Criteria (および CriteriaQuery) でコールバックされるため、その時点で maxResults を設定できます。

唯一の問題は、Hibernate が既に sql 文字列を作成しており、比較ステートメントを想定しているため、クエリ文字列に「and」を追加していることです。しかし、'1 = 1' を返すだけでこれを偽装できます。

以下の LimitBy Criterion の実装を参照してください。

public class Limit {
        private Limit() {}

        public static LimitBy by(int maxResults) {
            return new LimitBy(maxResults);
        }

        static class LimitBy implements Criterion {
            private int max;

            public LimitBy(int max) {
                this.max = max;
            }

            @Override
            public String toSqlString(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
                criteria.setMaxResults(max);
                return "1 = 1";
            }

            @Override
            public TypedValue[] getTypedValues(Criteria criteria, CriteriaQuery criteriaQuery) throws HibernateException {
                return new TypedValue[0];
            }
        }
    }

したがって、この LimitBy クラスでは、DetachedCriteria を使用して制限できるようになりました。

DetachedCriteria.forClass(..)
  .add(Limit.by(1));

そして今、これはクエリからの最初の結果のみを返します。

これは Postgres で動作し、他のデータベースではテストされていませんが、他のデータベースでも動作することを期待しています。一部の db から動作しない場合の応答。

于 2015-02-13T15:12:13.783 に答える
0

CRITERIA API で使用できるもの

detachedcrit.getExecutableCriteria(session).SetMaxResults(1) 
于 2014-08-11T16:05:43.217 に答える