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.

Reply via email to