在我现有的项目中,我有一个aprox。数据库中有70多个表,我使用Hibernate作为数据访问层,因此每个查询都是使用条件API / HQL /命名查询完成的。现在我们在名为isDeleted
的40多个表(事务表)中添加一列true
或false
。
现在在我当前的项目中,我必须通过在表上添加额外的Restrictions
\ Where Clause
来获取记录,这需要更多时间。
是否有任何方法可以拦截每个数据库查询(条件API / HQL /命名查询),以便我可以在相应的模型/表上添加where clause
。
休眠会话------> HQL /命名(本机)查询---->拦截器----->将在必填表格上添加where clause
---->将其发送到DB
答案 0 :(得分:1)
是的,您可以将动态滤波器与拦截器结合使用。
http://nhforge.org/wikis/howtonh/contextual-data-using-nhibernate-filters.aspx
对于具有此类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);
然后,您应该将过滤器添加到实现ISoftDeletable接口的每个映射类:
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);
}
}
然后,你仍然需要创建一个拦截器,它将参数的值设置为true或false,具体取决于你想要做什么。
也许你甚至可以在filterclause中对参数的值进行硬编码(如果你总是想要检索未删除的项目),这会使我的代码变得更简单。