2009-01-15 81 views
2

在SQL可以编写一个查询,搜索一个人的这样一个名字:unicode字符串在Hibernate查询

SELECT * FROM Person P WHERE P.Name LIKE N'%ike%' 

此查询将Unicode字符(假设名称列和数据库都安装运行处理unicode支持)。

我在HQL(NHibernate)运行的HQL中有类似的查询。生成的查询如下所示:

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?

有几个网站建议使用标准查询。由于我在工作的框架中存在一些限制,这是不可能的。

回答

2

你有没有试着用参数:

IList<Person> people = session 
    .CreateQuery("from Person p where p.Name like :name") 
    .SetParameter("name", "%カタカ%") 
    .List<Person>(); 

他们也必须保护你对SQL注入查询的优势。

+0

我递归构建一个复杂的查询字符串不同的标准和操作。我有一个提供者,我将操作和术语传入以获取“喜欢”部分。如果我不这样做,这将工作!我希望有一些神奇的逃生角色。 – 2009-01-15 19:39:35

+0

不幸的是,查询中可用参数的数量有限制,所以这不是最终的解决方案。 – spartaco 2017-07-25 13:55:13

2

我发现了一个可行的解决方案。我非常怀疑这是最好的解决方案。然而,这是我要实现的解决方案,直到我可以授权重写我正在开发的软件的整个查询构建部分。

在该实例:

SELECT P FROM SumTotal.TP.Models.Party.Person P join P.Demographics PD WHERE (PD.LastName LIKE '%カタカ%') 

where子句包含此字面:

'%カタカ%' 

此文字可以被分解成nchars其中休眠(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子句部分等于一个特定的数值,或者它可能正在查找字符串的起始字符。构建运算符的方法使用运算符类型和该术语来交回字符串。我可以重写,但这将是一个大任务。上述修复将允许我处理传递给此方法的字符串。我提供这个解决方案,因为它确实有效,但达林的答案可能是我能找到的最好方法。

0

出现此问题是因为NHibernate尝试访问没有类型长度的列。因此在HBM中。xml提及Legacy数据库的长度非常重要,否则它将失败UNIcode相关的东西。

感谢, 他尼