为了验证我们的oracle数据库在用Unicode提供它们时会给我们什么,我们使用一个简单的技巧:从dual中选择字符串。它在字符串上运行数据库编码。
select 'Let’s Go' from dual
现在我想使用NHibernate实现同样的功能。仅仅这样做:
string.Format("select '{0}' from dual", text);
使我的代码变得脆弱并且对SQL注入开放,所以我宁愿做以下其中一项:
//Version 1 : Named param
IQuery q = this.Session.CreateSQLQuery( "SELECT :staticstring from dual");
q.SetString(":staticstring", text);
// Version 2 : positional param
IQuery q = this.Session.CreateSQLQuery( "SELECT ? from dual");
q.SetString(0, text);
上述两种方式均失败,无法分配参数。我认为这是将参数放在'from'子句之前的任何地方的问题,但是当我尝试没有NH时,结果就是这样。顺便说一下,我尝试了Oracle9和10方言。
有没有其他方法可以使用NHibernate 2.1从我的oracle数据库中安全地选择静态字符串? Florian建议使用QueryOver,但这是3.0中的新功能......
解决方案(根据Florian和Phill的意见):
DetachedCriteria crit = DetachedCriteria.For<Freetext>()
.SetProjection(Projections.Cast(NHibernateUtil.String,Projections.Constant(text)))
.SetMaxResults( 1 );
string dbString = crit.GetExecutableCriteria( this.Session ).List < object >()[0].ToString();
答案 0 :(得分:4)
这可能有点矫枉过正,但它完成了工作:
string text = "Let's go";
var result = session.QueryOver<SomeTable>()
.Select(Projections.Cast(NHibernateUtil.String, Projections.Constant(text)))
.Take(1)
.List<object>();
string s = result[0] as string;