2014-09-10 38 views
0

我有这方面的工作。SQL查询:通过位置转换为了NHibernate的:(:较低(item.Name)name_lower)以HQL

select * 
from table1 t 
where t.Name like '%foo%' 
order by position('foo' IN lower(t.name)); 

我需要将其转换为HQL。 使用此代码

var hql = string.Format("select item from {0} item where item.Name like :name order by position(:name_lower IN lower(item.Name))", dtoName); 
var query = CurrentSession.CreateQuery(hql); 
query.SetParameter("name", string.Format("{0}{1}{0}", "%", name)); 
query.SetParameter("name_lower", name.ToLower()); 

导致异常调用的createQuery时:

Antlr.Runtime.MismatchedTokenException 

没有为了通过它工作正常。使用

order by item.Name 

也工作正常。所以看起来问题在于位置功能。 我一直在寻找一个hql等价物但是找不到它。

任何帮助将不胜感激。

+0

您可能需要创建自定义方言并注册位置功能。详情可以在这里找到:http://stackoverflow.com/questions/1845884/custom-sql-function-for-nhibernate-dialect – DanP 2014-09-10 12:45:55

回答

0

除了它是接受两个参数,并且不使用IN关键字我从使用位置功能的strpos功能,做同样的改变:

strpos(lower(item.Name), :name_lower) 

现在我的查询按预期工作。 我很高兴我不需要创建自定义方言;)

谢谢。