无法使用 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
前缀)。
那么,您似乎有两个选择:
HQL
继续使用createQuery
如下:
session.createQuery("from Table T " +
"where T.column like :fltr ")
.setParameter( "fltr", "%" + content + "%", StringNVarcharType.INSTANCE )
.list();
T-SQL
切换到使用 createSQLQuery
如下:
session.createSQLQuery("select * from Table T where T.column like N'%" +
content + "%' ").list();
这里可能要做的更多,但我没有办法测试它。
可以在以下位置找到更多信息和示例:Hibernate ORM 5.2.4.Final User Guide:
- 以上基于示例 334 的 HQL 代码
StringNVarcharType
类型在 2.3.1. Hibernate-provided BasicTypes: Table 1. Standard BasicTypes 的图表中找到
- T-SQL 以上代码基于示例 402 和示例 423
我正在开发 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
前缀)。
那么,您似乎有两个选择:
HQL
继续使用
createQuery
如下:session.createQuery("from Table T " + "where T.column like :fltr ") .setParameter( "fltr", "%" + content + "%", StringNVarcharType.INSTANCE ) .list();
T-SQL
切换到使用
createSQLQuery
如下:session.createSQLQuery("select * from Table T where T.column like N'%" + content + "%' ").list();
这里可能要做的更多,但我没有办法测试它。
可以在以下位置找到更多信息和示例:Hibernate ORM 5.2.4.Final User Guide:
- 以上基于示例 334 的 HQL 代码
StringNVarcharType
类型在 2.3.1. Hibernate-provided BasicTypes: Table 1. Standard BasicTypes 的图表中找到
- T-SQL 以上代码基于示例 402 和示例 423