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