NHibernate hbm映射集合whith where boolean属性的条件

时间:2013-06-13 15:52:46

标签: nhibernate mapping boolean compatibility

我有一个带有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"

是否有一种聪明的方法为我必须支持的所有三个db创建单个hbm.xml映射?

1 个答案:

答案 0 :(得分: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属性