0

テーブルBに存在しないすべての行をテーブルAから削除したいと思います。これを行うには、session.Delete(query)を次のように使用します。

Session.Delete<A>("FROM A WHERE id NOT IN (SELECT vpg_id FROM B)");

次のエラーが発生します。

NHibernate.QueryException: could not resolve property: vpg_id of: A [FROM A WHERE Id NOT IN (SELECT vpgid FROM B)]

次のようにHQLを使用してそれを実行してみました。

Session.CreateQuery("DELETE A WHERE id NOT IN (SELECT vpg_id FROM B)").ExecuteUpdate();

そしてこの例外を取得します:

    NHibernate.QueryException: No data type for node: IdentNode vpg_id [DELETE A WHERE id NOT IN (SELECT vpg_id FROM B)]
4

2 に答える 2

1

クラスのエイリアスを試してみてください(NHibernateリファレンスから:http://nhibernate.info/doc/nhibernate-reference/queryhql.html#queryhql-subqueries

from A as aClass 
where aClass.id not in ( 
    select bClass.vpg_id from B as bClass
)

または存在してみてください

from A as aClass 
where not exists ( 
    select bClass.vpg_id from B as bClass where aClass.id = bClass.vpg_id
)
于 2012-07-16T12:56:34.520 に答える
0

私はSQLネイティブでCreateSQLQueryを使用することによってのみそれを行うことができました:

const string deleteSql = @"DELETE FROM CheckpointStorageObject WHERE NOT EXISTS (Select 1 from CheckpointToProtectionGroup WHERE CheckpointToProtectionGroup.checkpoint_id = CheckpointStorageObject.id)";
Session.CreateSQLQuery(deleteSql).ExecuteUpdate();

CheckpointToProtectionGroupテーブルは2つの異なるテーブルへの2つの参照を持つ関連付けテーブルであるため、CreateQueryを使用できませんでした。その結果、checkpoint_id列はデータベースにのみ存在し、CheckpointToProtectionGroupクラスには存在しないため、NHibernateはCheckpointToProtectionGroup.checkpoint_idプロパティを解決できませんでした(エイリアスを使用した場合でも)。

CreateSQLQueryの前に呼び出されネイティブSQlに影響を与える可能性のある他のHQLを含むトランザクション内でCreateSQLQueryを使用する場合は、CreateSQLQueryを呼び出す前にsession.flush()を呼び出す必要があります。

于 2012-08-07T11:13:09.397 に答える