You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user-java@ibatis.apache.org by Anders Andersen <an...@cph.dk> on 2009/02/23 11:43:25 UTC

Trim on left side in where clause expressions

Hi,

We are trying to use iBATIS/Ibator on a database that is traditionally updated via optimistic locking.
Doing so we have come across a problem with our where clauses and the code that is generated
by Ibator, because most fields in our database are of type CHAR. In Ibator there is a supported
property called "trimStrings" on the <javaModelGenerator> element, however this only trim strings
on the right side of the where clause expressions (e.g. WHERE MYFIELD = rtrim('     Hello  ')) and
we need the left side to be trimmed as well. We can of cause changed the Ibator generated code
but that would be a manually process that would be overwritten next time we run Ibator.

We have tried to look at the possibilities for extending Ibator via Plug-In's or the like, but have not
found a good point of entry for this yet. However we have localized the place in the Ibator code
that we could change to solve this - it is ExampleGenerator.java:

-- snip --
private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
 String nameFragment, String operator) {

       ...


        sb.append(introspectedColumn.getAliasedActualColumnName());

        sb.append(' ');

        sb.append(operator);

        sb.append("\", "); //$NON-NLS-1$



        ...
    }
-- snip --

should be changed to

-- snip --
private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
 String nameFragment, String operator) {
       ...

        sb.append("rtrim(" + introspectedColumn.getAliasedActualColumnName()+ ")");
        sb.append(' ');
        sb.append(operator);
        sb.append("\", "); //$NON-NLS-1$

        ...
    }
-- snip --

Is this possible through a plug-in or otherwise?

Any information that can help us solve this will be highly appreciated!


Venlig hilsen / Kind regards

Anders Andersen

IT Consultant - IT afdelingen / IT department
Copenhagen Airports A/S
Lufthavnsboulevarden 6, DK-2770 Kastrup
Tel./Phone no.: +45 60660306
e-mail: anders.andersen@cph.dk

RE: Trim on left side in where clause expressions

Posted by Anders Andersen <an...@cph.dk>.
Thank a lot!

I have implemented a plugin like this and it solved our issue :-)

Btw, funny to note the SVN log on that new plugin example ;-)

plugins$ svn log CaseInsensitiveLikePlugin.java
------------------------------------------------------------------------
r747134 | jgbutler | 2009-02-23 21:58:13 +0100 (Mon, 23 Feb 2009) | 1 line

[Ibator] New example plugin for case insensitive LIKE searches
------------------------------------------------------------------------


Venlig hilsen / Kind regards

Anders Andersen

IT Consultant - IT afdelingen / IT department
Københavns Lufthavne A/S
Lufthavnsboulevarden 6, DK-2770 Kastrup
Tel./Phone no.: +45 60660306
e-mail: anders.andersen@cph.dk
________________________________________
From: Jeff Butler [jeffgbutler@gmail.com]
Sent: Monday, February 23, 2009 10:54 PM
To: user-java@ibatis.apache.org
Subject: Re: Trim on left side in where clause expressions

This is possible in a couple of ways - you could do it with a plugin,
or by extending the generated example classes.

With a plugin, the basic idea is to add methods to the example's inner
Criteria class to deal with the RTRIM function (and LTRIM too???).  I
was going to explain how, but an example is better.  See here:

http://svn.apache.org/repos/asf/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/plugins/CaseInsensitiveLikePlugin.java

This plugin adds case insensitive LIKE expressions to the generated
example class.  You could use it as a model for developing your own
plugin.

The Ibator documentation includes a page on extending the example
classes that shows how to accomplish this by extension.

If you have a lot of CHAR fields that you want to use, then the plugin
would be better.

Hope that helps -
Jeff Butler


On Mon, Feb 23, 2009 at 4:43 AM, Anders Andersen <an...@cph.dk> wrote:
> Hi,
>
> We are trying to use iBATIS/Ibator on a database that is traditionally updated via optimistic locking.
> Doing so we have come across a problem with our where clauses and the code that is generated
> by Ibator, because most fields in our database are of type CHAR. In Ibator there is a supported
> property called "trimStrings" on the <javaModelGenerator> element, however this only trim strings
> on the right side of the where clause expressions (e.g. WHERE MYFIELD = rtrim('     Hello  ')) and
> we need the left side to be trimmed as well. We can of cause changed the Ibator generated code
> but that would be a manually process that would be overwritten next time we run Ibator.
>
> We have tried to look at the possibilities for extending Ibator via Plug-In's or the like, but have not
> found a good point of entry for this yet. However we have localized the place in the Ibator code
> that we could change to solve this - it is ExampleGenerator.java:
>
> -- snip --
> private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
>  String nameFragment, String operator) {
>
>       ...
>
>
>        sb.append(introspectedColumn.getAliasedActualColumnName());
>
>        sb.append(' ');
>
>        sb.append(operator);
>
>        sb.append("\", "); //$NON-NLS-1$
>
>
>
>        ...
>    }
> -- snip --
>
> should be changed to
>
> -- snip --
> private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
>  String nameFragment, String operator) {
>       ...
>
>        sb.append("rtrim(" + introspectedColumn.getAliasedActualColumnName()+ ")");
>        sb.append(' ');
>        sb.append(operator);
>        sb.append("\", "); //$NON-NLS-1$
>
>        ...
>    }
> -- snip --
>
> Is this possible through a plug-in or otherwise?
>
> Any information that can help us solve this will be highly appreciated!
>
>
> Venlig hilsen / Kind regards
>
> Anders Andersen
>
> IT Consultant - IT afdelingen / IT department
> Copenhagen Airports A/S
> Lufthavnsboulevarden 6, DK-2770 Kastrup
> Tel./Phone no.: +45 60660306
> e-mail: anders.andersen@cph.dk
>

Re: Trim on left side in where clause expressions

Posted by Jeff Butler <je...@gmail.com>.
This is possible in a couple of ways - you could do it with a plugin,
or by extending the generated example classes.

With a plugin, the basic idea is to add methods to the example's inner
Criteria class to deal with the RTRIM function (and LTRIM too???).  I
was going to explain how, but an example is better.  See here:

http://svn.apache.org/repos/asf/ibatis/trunk/java/tools/ibator/core/src/org/apache/ibatis/ibator/plugins/CaseInsensitiveLikePlugin.java

This plugin adds case insensitive LIKE expressions to the generated
example class.  You could use it as a model for developing your own
plugin.

The Ibator documentation includes a page on extending the example
classes that shows how to accomplish this by extension.

If you have a lot of CHAR fields that you want to use, then the plugin
would be better.

Hope that helps -
Jeff Butler


On Mon, Feb 23, 2009 at 4:43 AM, Anders Andersen <an...@cph.dk> wrote:
> Hi,
>
> We are trying to use iBATIS/Ibator on a database that is traditionally updated via optimistic locking.
> Doing so we have come across a problem with our where clauses and the code that is generated
> by Ibator, because most fields in our database are of type CHAR. In Ibator there is a supported
> property called "trimStrings" on the <javaModelGenerator> element, however this only trim strings
> on the right side of the where clause expressions (e.g. WHERE MYFIELD = rtrim('     Hello  ')) and
> we need the left side to be trimmed as well. We can of cause changed the Ibator generated code
> but that would be a manually process that would be overwritten next time we run Ibator.
>
> We have tried to look at the possibilities for extending Ibator via Plug-In's or the like, but have not
> found a good point of entry for this yet. However we have localized the place in the Ibator code
> that we could change to solve this - it is ExampleGenerator.java:
>
> -- snip --
> private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
>  String nameFragment, String operator) {
>
>       ...
>
>
>        sb.append(introspectedColumn.getAliasedActualColumnName());
>
>        sb.append(' ');
>
>        sb.append(operator);
>
>        sb.append("\", "); //$NON-NLS-1$
>
>
>
>        ...
>    }
> -- snip --
>
> should be changed to
>
> -- snip --
> private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
>  String nameFragment, String operator) {
>       ...
>
>        sb.append("rtrim(" + introspectedColumn.getAliasedActualColumnName()+ ")");
>        sb.append(' ');
>        sb.append(operator);
>        sb.append("\", "); //$NON-NLS-1$
>
>        ...
>    }
> -- snip --
>
> Is this possible through a plug-in or otherwise?
>
> Any information that can help us solve this will be highly appreciated!
>
>
> Venlig hilsen / Kind regards
>
> Anders Andersen
>
> IT Consultant - IT afdelingen / IT department
> Copenhagen Airports A/S
> Lufthavnsboulevarden 6, DK-2770 Kastrup
> Tel./Phone no.: +45 60660306
> e-mail: anders.andersen@cph.dk
>