Hibernate:拦截每个数据库查询

Hibernate:拦截每个数据库查询,hibernate,Hibernate,在我现有的项目中,我有一个项目。数据库中有70多个表,我使用Hibernate作为数据访问层,所以每个查询都是使用API/HQL/命名查询条件完成的。现在,我们正在40多个表(事务表)中添加一列,名为isDeleted,即true或false 现在,在我当前的项目中,我必须通过在表上添加额外的限制\Where子句来获取记录,这需要更多的时间 是否有任何方法可以截取每个数据库查询(criteria API/HQL/命名查询),以便在相应的模型/表上添加where子句 Hibernate会话----

在我现有的项目中,我有一个项目。数据库中有70多个表,我使用Hibernate作为数据访问层,所以每个查询都是使用API/HQL/命名查询条件完成的。现在,我们正在40多个表(事务表)中添加一列,名为
isDeleted
,即
true
false

现在,在我当前的项目中,我必须通过在表上添加额外的
限制
\
Where子句
来获取记录,这需要更多的时间

是否有任何方法可以截取每个数据库查询(criteria API/HQL/命名查询),以便在相应的模型/表上添加
where子句


Hibernate会话------->HQL/命名(本机)查询------->拦截器------>将在所需的表上添加
where子句
,并将其进一步发送到DB

是的,您可以将动态筛选器与拦截器结合使用

对于所有具有此类isDeleted属性的实体,我会让它们实现一个定义此属性的特定接口。 例如:

interface ISoftDeletable
{
   bool IsDeleted { get; }
}

class SomeEntity : ISoftDeletable {}
(请注意,我使用C#来解释我的观点,但我想它在java中会非常类似)

然后,您可以在创建Hibernate配置时定义筛选器定义:

var softDeleteFilterParametersType = new Dictionary<string, NHibernate.Type.IType> (1);
softDeleteFilterParametersType.Add ("p_isDeleted", NHibernateUtil.Bool);

cfg.AddFilterDefinition (new FilterDefinition("SoftDeleteFilter", ":p_isDeleted = isDeleted", softDeleteFilterParametersType, false);
然后,您仍然需要创建一个拦截器,该拦截器将参数的值设置为true或false,具体取决于您想要执行的操作


也许您甚至可以在filterclause中硬编码参数值(如果您总是想检索未删除的项目),这将使上述代码更简单。

谢谢您,先生,请快速回复。您能否提供一些相同的演示代码。
foreach( var m in cfg.ClassMappings )
{
    if( typeof(ISoftDeletable).IsAssignableFrom (m.MappedClass) )
    {
        Property delColumn = m.GetProperty ("IsDeleted");

        m.AddFilter ("SoftDeleteFilter", ":p_isDeleted = " + delColumn.ColumnIterator.First().Name);
    }
}