我有一个带有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但是会破坏需要像
这样的条件的PostgreSQLwhere="BProp = true"
是否有一种聪明的方法为我必须支持的所有三个db创建单个hbm.xml映射?
答案 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