Hi,
Is there the good way to customize generated SQL statements?
The solution I found requires adding my custom classes into the
org.apache.ojb.broker.accesslayer.sql package what I particularly dislike.
I need to make query with case-insensitive LIKE-clause, that's something
like this:
SELECT ... WHERE UPPER(name) LIKE UPPER('alex%')
Here is my solution:
I created subclass of SqlSelectStatement and overrode appendCriteria:
protected void appendCriteria(TableAlias alias, PathInfo pathInfo,
SelectionCriteria c, StringBuffer buf)
{
if (c instanceof LikeCriteria)
appendLikeCriteria(alias, pathInfo,(LikeCriteria) c, buf);
else
super.appendCriteria(alias, pathInfo, c, buf);
}
and added new method
private void appendLikeCriteria(TableAlias alias, PathInfo pathInfo,
LikeCriteria c, StringBuffer buf)
{
buf.append(" UPPER(");
appendColName(alias, pathInfo, c.isTranslateAttribute(), buf);
buf.append(") ");
buf.append(c.getClause());
buf.append(" UPPER(?) ");
}
These two methods reference to TableAlias class, which is declared as
package-private in org.apache.ojb.broker.accesslayer.sql.SqlQueryStatement.
That's why I have to place my class into the same package.
This subclass is instantiated in overridden
SqlGeneratorDefaultImpl#getPreparedSelectStatement
Implementing it similarly to the parent I need access to SqlCacheKey class,
which is also not public; hence, the ancestor of SqlGeneratorDefaultImpl is
placed to org.apache.ojb.broker.accesslayer.sql package too.
Best regards,
Alexey.