【问题标题】:Unicode String in Hibernate Queries休眠查询中的 Unicode 字符串
【发布时间】:2010-10-01 15:29:54
【问题描述】:

在 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?​​p>

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

【问题讨论】:

    标签: c# nhibernate hibernate unicode hql


    【解决方案1】:

    您是否尝试过使用参数:

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

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

    【讨论】:

    • 我正在递归地构建一个具有不同标准和操作的复杂查询字符串。我有一个提供程序,我将操作和术语传递给以获取“喜欢”部分。如果我不这样做,这将起作用!我希望有一些魔法逃脱角色。
    • 不幸的是,查询中可用的参数数量有限,因此这不是最终的解决方案。
    【解决方案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 子句部分,或者它可能正在查找字符串的起始字符。构建运算符的方法使用运算符类型和术语来回传字符串。我可以重写它,但这将是一项艰巨的任务。上述修复将允许我处理传递给此方法的字符串。我提供这个解决方案是因为它确实有效,但 darin 的回答可能是我能找到的最好方法。

    【讨论】:

    • 它工作,这是一个好主意,比使用参数更好,因为这样你没有任何限制。
    【解决方案3】:

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

    谢谢, 他尼

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 2011-07-17
      • 2015-04-17
      • 2013-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多