NHibernate-是否可以在更新/删除时应用过滤器?

NHibernate-是否可以在更新/删除时应用过滤器?,nhibernate,filter,sql-update,sql-delete,Nhibernate,Filter,Sql Update,Sql Delete,我知道我们可以很容易地使用NHibernate应用过滤器来查询附加的where条件,但是在执行更新或删除时是否可以应用过滤器 如果是,我该如何实现这一点?是的,可以使用HQL(Hibernate查询语言) 下面是一个批量更新的示例 IQuery updateQuery = this.Session.CreateQuery("update TransferItem set Status = :newStatus where Status = :oldStatus")

我知道我们可以很容易地使用NHibernate应用过滤器来查询附加的
where
条件,但是在执行更新或删除时是否可以应用过滤器


如果是,我该如何实现这一点?

是的,可以使用HQL(Hibernate查询语言)

下面是一个批量更新的示例

IQuery updateQuery = this.Session.CreateQuery("update TransferItem set Status = :newStatus where Status = :oldStatus")
                        .SetParameter("oldStatus", DownloadStatus.Active)
                       .SetParameter("newStatus", DownloadStatus.Queued);
updateQuery.ExecuteUpdate();
NHibernate应用配置的映射来创建和运行以下SQL:

 update cms_TransferItem set Status=@p0 where Status=@p1
下面是一个批量删除的示例

IQuery deleteQuery = this.Session.CreateQuery("delete TransferItem ti WHERE ti.Status = :statusToGo")
                           .SetParameter("statusToGo", DownloadStatus.Completed);

deleteQuery.ExecuteUpdate();
它执行SQL的方式如下:

 delete from cms_TransferItem where Status=@p0

您可能会问,如果必须使用查询语言,为什么不直接编写原始SQL?当您使用HQL时,您正在处理.NET代码其余部分正在处理的概念性业务对象。ORM工具的好处在于,对于大部分代码,数据库表和对象到表的映射都被抽象掉了。使用HQL,您将继续与对象层交互,而不是直接与数据库表交互。

有趣,但遗憾的是,在我的例子中,这不起作用,因为我们使用的是通用存储库模式。其思想是在更新或删除时应用来自数据库的自定义函数调用。有没有一种方法可以通过简单的
会话。保存或更新
会话。删除
调用来完成?(对于每次删除或更新,过滤器都会生成如下内容:
其中IsOperationAllowedFromUser(:userId,:itemId)
)@Sam9291是
IsOperationAllowedFromUser
SQL函数还是.NET函数?它应该是SQL函数function@Sam9291-您可以调用自定义SQL函数作为HQL的一部分。首先,您必须扩展方言,以便它了解其功能。这里有一篇博文