在SQL中,可以编写一个查询人员姓名的查询:
SELECT * FROM Person P WHERE P.Name LIKE N'%ike%'
此查询将使用unicode字符运行(假设Name列和数据库已设置为处理unicode支持)。
我在HQL中有一个类似的查询,它由Hibernate(NHibernate)运行。生成的查询如下所示:
SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%' )
不幸的是,在HQL中的文字前面放置一个'N'会导致错误。我试过转义字符串中的unicode字符但仍然没有成功。
数据库正在接受并保存来自Hibernate的unicode字符。我已经能够使用unicode字符串成功填充对象,使用Hibernate保存它,并在数据库中验证它。在我看来有点奇怪,我不能在自定义查询中使用unicode字符串(或者我也假设命名查询)。
这是Hibernate(Nhibernate)的已知问题或限制吗?你如何在HQL中使用unicode? p>
有几个网站建议使用Criteria查询。由于我正在使用的框架中的限制,这是不可能的。
答案 0 :(得分:2)
您是否尝试过参数:
IList<Person> people = session
.CreateQuery("from Person p where p.Name like :name")
.SetParameter("name", "%カタカ%")
.List<Person>();
它们还具有保护查询免受SQL注入的优势。
答案 1 :(得分:2)
我找到了一个有效的解决方案。我非常怀疑这是最好的解决方案。然而,这是我要实现的解决方案,直到我可以授权重写我正在处理的软件的整个查询构建部分。
在实例中:
SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%')
where子句包含这个文字:
'%カタカ%'
这个文字可以被分解成nchars,Hibernate(Nhibernate)会在不知不觉中传递给它生成的SQL。奇怪,但它的确有效。因此,先前的查询可以写为:
SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%' + nchar(0x30AB) + nchar(0x30BF) + nchar(0x30AB)+ '%')
这个解决方案远非最佳,因为它需要遍历每个字符并确定它是否是多字节字符。但是,如果此代码存在于其应用程序中,则它将在动态查询生成器中使用,该生成器在不同操作下处理多个不同的条件。在我给它的例子中,它在字符串中的任何地方寻找unicode。该函数可能返回等于特定数值的列的where子句部分,或者它可能正在查找字符串的起始字符。构建运算符的方法使用运算符类型和术语来传回字符串。我可以重写一下,但这将是一项艰巨的任务。上面的修复将允许我处理传递给此方法的字符串。我提供这种解决方案是因为它确实有效,但达林的回答可能是我能找到的最佳方式。
答案 2 :(得分:0)
出现此问题是因为NHibernate尝试访问没有类型长度的列。因此,在HBM.xml中,提及Legacy数据库的长度非常重要,否则它将因UNIcode相关内容而失败。
谢谢, 他尼