0

我想从表 A 中删除表 B 中不存在的所有行。为了做到这一点,我使用 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 native 的 CreateSQLQuery 来做到这一点:

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

我不能使用 CreateQuery,因为 CheckpointToProtectionGroup 表是一个关联表,它有 2 个对 2 个不同表的引用。结果 NHibernate 无法解析 CheckpointToProtectionGroup.checkpoint_id 属性(即使我使用了别名),因为 checkpoint_id 列仅存在于数据库中,但不存在于 CheckpointToProtectionGroup 类中。

如果您在包含在 CreateSQLQuery 之前调用的其他 HQL 并可能影响您的本机 SQl 的事务中使用 CreateSQLQuery - 您应该在调用 CreateSQLQuery 之前调用 session.flush()。

于 2012-08-07T11:13:09.397 回答