Hello
I have faced with the following problem. I use Hibernate-3.1.3 with ClassicQueryTranslatorFactory under MySQL 4.0.20d.
I need the SQL function "day". MySQL 4.0 does not have day function, but it has equal "dayofmonth". MySQLDialect.java has the following definition:
Code:
registerFunction("day", new StandardSQLFunction("day", Hibernate.INTEGER) );
In order to have compatibility both with MySQL 4.0 and above I have written my own Dialect which override day function in the following way:
Code:
registerFunction("day", new StandardSQLFunction("dayofmonth", Hibernate.INTEGER) );
With ASTQueryTranslator this dialect works corrrectly, but with Classic one it does not work!!!
I have examined Hibernate SRC and have found out that we have follwing code in the org.hibernate.hql.classic.SelectParser: 126
Code:
else if ( getFunction( lctoken, q ) != null && token.equals( q.unalias( token ) ) ) {
// the name of an SQL function
if ( !ready ) throw new QueryException( ", expected before aggregate function in SELECT: " + token );
aggregate = true;
aggregateAddSelectScalar = true;
aggregateFuncTokenList.add( lctoken );
ready = false;
q.appendScalarSelectToken( token );
if ( !aggregateHasArgs( lctoken, q ) ) {
q.addSelectScalar( aggregateType( aggregateFuncTokenList, null, q ) );
if ( !aggregateFuncNoArgsHasParenthesis( lctoken, q ) ) {
aggregateFuncTokenList.removeLast();
if ( aggregateFuncTokenList.size() < 1 ) {
aggregate = false;
ready = false;
}
else {
ready = true;
}
}
}
}
we can see that we call
Code:
q.appendScalarSelectToken( token );
function with original token, we do not use "render" method of org.hibernate.dialect.function.StandardSQLFunction.
Is this a bug of classic translator?
I am obliged to use Classic translator because Weblogic's problems with AST. Please give me an advice.
Thanks beforehand.