HQL doesn't support multi-byte character in class name and property names

Description

HQL:
from User user where user.\u4e2d like '%\u4e2d%'

when classname or property name contains multi-byte character, Query.list() will throws an exception which says
org.hibernate.QueryException: unexpected char: 0xF6 [from com.hsd.security.User user where user.中文 like '%中文%']
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:165)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
at test.TestHibernate.test中文字符串(TestHibernate.java:11)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:474)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:342)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:194)
Caused by: line 1:44: unexpected char: 0xF6
at org.hibernate.hql.antlr.HqlBaseLexer.nextToken(HqlBaseLexer.java:281)
at antlr.TokenBuffer.fill(TokenBuffer.java:69)
at antlr.TokenBuffer.LA(TokenBuffer.java:80)
at antlr.LLkParser.LA(LLkParser.java:52)
at org.hibernate.hql.antlr.HqlBaseParser.identPrimary(HqlBaseParser.java:3728)
at org.hibernate.hql.antlr.HqlBaseParser.primaryExpression(HqlBaseParser.java:3311)
at org.hibernate.hql.antlr.HqlBaseParser.atom(HqlBaseParser.java:3031)
at org.hibernate.hql.antlr.HqlBaseParser.unaryExpression(HqlBaseParser.java:2806)
at org.hibernate.hql.antlr.HqlBaseParser.multiplyExpression(HqlBaseParser.java:2687)
at org.hibernate.hql.antlr.HqlBaseParser.additiveExpression(HqlBaseParser.java:2407)
at org.hibernate.hql.antlr.HqlBaseParser.concatenation(HqlBaseParser.java:481)
at org.hibernate.hql.antlr.HqlBaseParser.relationalExpression(HqlBaseParser.java:2195)
at org.hibernate.hql.antlr.HqlBaseParser.equalityExpression(HqlBaseParser.java:2057)
at org.hibernate.hql.antlr.HqlBaseParser.negatedExpression(HqlBaseParser.java:2020)
at org.hibernate.hql.antlr.HqlBaseParser.logicalAndExpression(HqlBaseParser.java:1937)
at org.hibernate.hql.antlr.HqlBaseParser.logicalOrExpression(HqlBaseParser.java:1901)
at org.hibernate.hql.antlr.HqlBaseParser.expression(HqlBaseParser.java:1663)
at org.hibernate.hql.antlr.HqlBaseParser.logicalExpression(HqlBaseParser.java:1834)
at org.hibernate.hql.antlr.HqlBaseParser.whereClause(HqlBaseParser.java:376)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:617)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:263)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:150)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:209)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127)
... 19 more

Activity

Steve EbersoleMarch 21, 2011 at 7:00 PM

Closing stale resolved issues

GavinGJune 6, 2005 at 3:10 PM

I'm fine with allowing multibyte character support here.

johnjJune 6, 2005 at 1:44 PM

This was allowed in 2.X

Joshua DavisJune 4, 2005 at 4:28 AM

Changing the code to use a StringReader instead of an InputStream gives the expected (to me, at least) error message:

line 1:27: unexpected char: 0x432D
at org.hibernate.hql.antlr.HqlBaseLexer.nextToken(HqlBaseLexer.java:281)
at antlr.TokenBuffer.fill(TokenBuffer.java:69)

So, it's now complaining about the character. This is correct as per the definition of HQL which states that identifiers begin with 'a' through 'z' or '_'.

I'll check with Gavin to see if we want to extend the characters that can be in an identifier.

Fixed

Details

Assignee

Reporter

Fix versions

Priority

Created May 31, 2005 at 7:58 AM
Updated March 21, 2011 at 7:00 PM
Resolved June 7, 2005 at 1:40 PM

Flag notifications