Hibernate查询中的Unicode字符串
在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保存它,并在数据库中validation它。 在我看来,我不能在自定义查询中使用unicode字符串(或者我也假设命名查询)。
这是Hibernate(Nhibernate)的已知问题或限制吗? 你如何在HQL中使用unicode?
有几个网站建议使用Criteria查询。 由于我正在使用的框架中的限制,这是不可能的。
你试过参数:
IList people = session .CreateQuery("from Person p where p.Name like :name") .SetParameter("name", "%カタカ%") .List ();
它们还有一个优点,可以保护您的查询免受SQL注入。
我找到了一个有效的解决方案。 我非常怀疑这是最好的解决方案。 然而,这是我要实现的解决方案,直到我可以授权重写我正在处理的软件的整个查询构建部分。
在实例中:
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子句部分,或者它可能正在查找字符串的起始字符。 构建运算符的方法使用运算符类型和术语来传回字符串。 我可以重写一下,但这将是一项艰巨的任务。 上面的修复将允许我处理传递给此方法的字符串。 我提供这种解决方案是因为它确实有效,但达林的答案可能是我能找到的最佳方式。
出现此问题是因为NHibernate尝试访问没有类型长度的列。 因此,在HBM.xml中,提及Legacy数据库的长度非常重要,否则它将因UNIcode相关的内容而失败。
谢谢,Thani