diff --git a/hibernate-core/src/main/java/org/hibernate/sql/Template.java b/hibernate-core/src/main/java/org/hibernate/sql/Template.java index 3daf5be57163..d834ef26d1b2 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/Template.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/Template.java @@ -164,6 +164,8 @@ public static String renderWhereStringTemplate( boolean inFromClause = false; boolean afterFromTable = false; boolean inExtractOrTrim = false; + boolean inCast = false; + boolean afterCastAs = false; boolean hasMore = tokens.hasMoreTokens(); String nextToken = hasMore ? tokens.nextToken() : null; @@ -237,6 +239,14 @@ else if ( FUNCTION_WITH_FROM_KEYWORDS.contains(lcToken) && "(".equals( nextToken result.append(token); inExtractOrTrim = true; } + else if ( "cast".equals( lcToken ) ) { + result.append( token ); + inCast = true; + } + else if ( inCast && ("as".equals( lcToken ) || afterCastAs) ) { + result.append( token ); + afterCastAs = true; + } else if ( !inFromClause // don't want to append alias to tokens inside the FROM clause && isIdentifier( token ) && !isFunctionOrKeyword( lcToken, nextToken, dialect, typeConfiguration ) @@ -248,6 +258,8 @@ && isIdentifier( token ) else { if ( ")".equals( lcToken) ) { inExtractOrTrim = false; + inCast = false; + afterCastAs = false; } else if ( !inExtractOrTrim && BEFORE_TABLE_KEYWORDS.contains(lcToken) ) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/TemplateTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/TemplateTest.java index dc612608da39..6d69db02620d 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/TemplateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/TemplateTest.java @@ -74,7 +74,10 @@ public void templateLiterals(SessionFactoryScope scope) { "where {@}.foo>10 and {@}.bar is not null", factory ); assertWhereStringTemplate("select t.foo, o.bar from table as t left join other as o on t.id = o.id where t.foo>10 and o.bar is not null order by o.bar", "select t.foo, o.bar from table as t left join other as o on t.id = o.id where t.foo>10 and o.bar is not null order by o.bar", factory ); - + assertWhereStringTemplate( "CAST(foo AS unsigned)", + "CAST({@}.foo AS unsigned)", factory ); + assertWhereStringTemplate( "CAST(foo AS signed)", + "CAST({@}.foo AS signed)", factory ); } private static void assertWhereStringTemplate(String sql, SessionFactoryImplementor sf) {