2

我有一个带有 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 映射?

4

1 回答 1

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");
.

我想你可以有你的 xml 映射,where="BProp = true"只需为 query.substitions 插入 cfg 属性,具体取决于方言是 MsSql / Oracle 还是 PosgresSQL

于 2013-06-13T16:05:28.557 回答