Atlassian uses cookies to improve your browsing experience, perform analytics and research, and conduct advertising. Accept all cookies to indicate that you agree to our use of cookies on your device. Atlassian cookies and tracking notice, (opens new window)
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
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.
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