【问题标题】:NHibernate hbm mapping collection whith where condition on boolean propertyNHibernate hbm 映射集合,其中布尔属性的条件
【发布时间】:2013-06-10 02:28:33
【问题描述】:

我有一个带有 bool 属性的实体 A(我们称之为 BProp)。 在第二个实体中,有一个 A 元素的包映射,在 BProp 上具有 where 条件,如下所示:

<bag name="MyBag" cascade="all-delete-orphan" inverse="false" where="BProp = 1">
    <key column="Structure_Id" />
    <one-to-many entity-name="A" />
</bag>

问题是 BProp = 1 可与 SqlServer 和 Oracle 一起使用,但会破坏需要类似条件的 PostgreSQL

where="BProp = true"

有没有一种聪明的方法可以为我必须支持的所有三个数据库创建单个 hbm.xml 映射?

【问题讨论】:

    标签: nhibernate mapping boolean compatibility


    【解决方案1】:

    由于在这种过滤器情况下查询替换似乎不是一个可用的解决方案,您可能会选择查询拦截器(这里是一个相当粗略的实现):

    public class BooleanInterceptor : EmptyInterceptor, IInterceptor
    {
        public string TrueToken { get; set; }
        public string FalseToken { get; set; }   
    
        NHibernate.SqlCommand.SqlString IInterceptor.OnPrepareStatement(NHibernate.SqlCommand.SqlString sql)
        {
            return sql.Replace("{TrueToken}", TrueToken).Replace("{FalseToken}", FalseToken);
        }
    }
    

    您的映射将是where="BProp = {TrueToken}"

    会这样使用

    var interceptor = new BooleanInterceptor ();
    using (var session = sessionFactory.OpenSession(interceptor))
    {
        interceptor.FalseToken = "0";  // this replacement value should be taken from a config file
        interceptor.TrueToken = "1";  // see above
    
        // your code here
    
        session.Close();
    }
    

    我敢打赌有更好的解决方案,但我希望这会有所帮助

    --------------上一个答案

    我用来在我的 NHibernate 配置中插入查询替换,像这样

    var cfg = new Configuration();
    cfg.Properties.Add("dialect", "NHibernate.Dialect.MsSql2005Dialect");
    .
    cfg.Properties.Add("query.substitutions", "true 1, false 0");
    .
    

    我猜你可以使用where="BProp = true" 进行 xml 映射,然后根据方言是 MsSql / Oracle 还是 PosgresSQL 插入 query.substitions 的 cfg 属性

    【讨论】:

    • 从文档和一些尝试中我发现此属性适用于 HSQL 到 SQL,而 hbm 文件中的 where 子句直接映射到 SQL,因此没有替代“BProp = false”。
    • @TerenzioBerni 想到了另一种方法。希望这会有用。感谢后续!
    • 谢谢,目前我正在评估 SafeBoolean UserType 的定义,它将布尔值映射到数字列,以保证在所有数据库上布尔值都将保存为数字。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 2012-09-28
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多