2

在 SQL 中,可以编写一个查询来搜索一个人的姓名,如下所示:

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

此查询将使用 unicode 字符运行(假设 Name 列和数据库已设置为处理 unicode 支持)。

我在 Hibernate (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?

一些网站建议使用 Criteria 查询。由于我正在使用的框架中的限制,这是不可能的。

4

3 回答 3

2

您是否尝试过使用参数:

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

它们还具有保护您的查询免受 SQL 注入的优势。

于 2009-01-15T17:34:39.457 回答
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 子句部分,或者它可能正在查找字符串的起始字符。构建运算符的方法使用运算符类型和术语来回传字符串。我可以重写它,但这将是一项艰巨的任务。上述修复将允许我处理传递给此方法的字符串。我提供这个解决方案是因为它确实有效,但不敢

于 2009-01-15T19:47:02.857 回答
0

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

谢谢, 塔尼

于 2011-04-07T09:54:42.357 回答