无法使用 HQL 从我的 Java 应用查询包含阿拉伯语的 SQL 服务器 table

Cannot query SQL Server table containing Arabic from my Java app using HQL

我正在开发 Java Swing 应用程序,我在其中查询 SQL 服务器数据库中的 table。 table 包含一些阿拉伯语、中文等数据...但问题是我在使用此查询时没有得到任何结果:(var 可以是阿拉伯语或任何其他语言):

from Table T where T.columnName like '%"+var+"%'

我进行了一些搜索,然后尝试了以下操作:

from Table T where T.columnName like N'%"+var+"%'

我在 NetBeans 上收到此错误消息:

Exception in thread "AWT-EventQueue-0"

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: N near line 1

有人可以帮我解决这个问题吗?我很困惑知道最后一个查询在 SQL Server Management Studio 中运行得很好。

将您的 var 声明为 NVARCHAR,并删除引号。

FROM Table T WHERE T.columnName LIKE N'%' + var + N'%'

使用以下 HQL:

String hql = "FROM Table T WHERE T.columnName LIKE CONCAT('%', :columnValue, '%')";
session.createQuery(hql)
       .setString("columnValue", "Sample Value")
       .list();

问题在于 HQL != T-SQL,而您将两者混为一谈。 HQL 是伪 SQL,因此不理解 Unicode 字符串的 T-SQL 特定方言处理(即字符串文字的 N 前缀)。

那么,您似乎有两个选择:

  1. HQL

    继续使用createQuery如下:

    session.createQuery("from Table T " +
                        "where T.column like :fltr ")
           .setParameter( "fltr", "%" + content + "%", StringNVarcharType.INSTANCE )
           .list();
    
  2. T-SQL

    切换到使用 createSQLQuery 如下:

    session.createSQLQuery("select * from Table T where T.column like N'%" +
                           content + "%' ").list();
    

    这里可能要做的更多,但我没有办法测试它。

可以在以下位置找到更多信息和示例:Hibernate ORM 5.2.4.Final User Guide: