1

Criteriaクエリに問題があります。

他の方法では、データベース内のいくつかのオブジェクトを削除するためにHQLクエリを使用します。クエリは機能します。

別の方法では、実際には、オブジェクトを取得するCriteriaクエリを実行します。オブジェクトを取得すると、データベースに同期されません。

それで1.REALオブジェクトを取得するために、roderでこの基準クエリをどのように同期しましたか?2. 1.が不可能な場合、CriteriaクエリをHQLに変換したい

ここに私の基準クエリ:

    final Criteria crit = session.createCriteria(ObjectDao.class);
    if (clientName != null && clientName.length() > 0) {
        crit.createAlias("objectType.client", "client");
        crit.add(Restrictions.eq("client.name", clientName));
    }
    if (objectType != null && objectType.length() > 0) {
        crit.createAlias("objectType", "objectType");
        crit.add(Restrictions.eq("objectType.type", objectType));
    }
    final List<ObjectDao> ret = crit.list();

そして、HQl変換されたクエリは機能しません

    String hqlQuery = "select ObjectDao where objectType.client.name = :clientName";
    Query query = session.createQuery(hqlQuery)
    // .setParameter("objectList", objectType)
            .setParameter("clientName", clientName);
    final List<ObjectDao> ret2 = query.list();

ありがとう!

4

2 に答える 2

0

レベル2のキャッシュを使用しているようです。もしそうなら、これも機能しません。

select o from ObjectDao o where o.objectType.client.name = :clientName
于 2011-10-07T10:46:34.780 に答える
0

私が正しく理解していれば、あなたは次のようなクエリを実行しています

delete from Client where ...

次に、削除したばかりのクライアントをまだ持っているObjectDaosを返すCriteriaクエリを実行します。

そうであれば、それは期待される動作です。DMLスタイルのクエリ(つまり、クエリの更新と削除)は、セッションをバイパスします。これは、削除したオブジェクトが削除クエリの前にセッションにすでにロードされている場合、Hibernateはそれらをセッションから削除せず、セッションはデータベースの実際の状態を反映しないことを意味します。

Session.deleteを使用してオブジェクトを削除し、オブジェクトグラフをメモリに保持するようにしてください。

または、削除クエリの後にセッションをフラッシュしてクリアします。

于 2011-10-07T10:50:53.653 に答える