Jakob,
Perhaps I am misunderstanding your question. When you say "why can't we add the
ESCAPE to the search argument?", do you mean add it like the following?
criteria.addLike("*\\%* ESCAPE '\\'") // to search for any text containing
// the '%' character.
If this is not what you mean, then I will need some clarification.
If this 'is' the case, it will not work because the desired sql statement is:
select * from mytable where desc like ? ESCAPE '\'
? Is a replacement var that will be replace with "%\\%%" after the
statement is prepared.
What adding to the search argument using the addLike as shown above, it would
actually produce:
select * from mytable where desc like ?
? Is replaced with "%\\%% ESCAPE '\\' ". Which isn't what we want to search
for.
Does this help?
Paul
-----Original Message-----
From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
Sent: Friday, February 20, 2004 2:49 PM
To: OJB Users List
Subject: Re: Query with criteria - like using '%' or '_'
hi paul,
Nase, Paul R. wrote:
> Jakob,
>
>
>>i just don't see why we can't construct the whole string in criteria.
>>in appendSelectionCriteria you simply append " ESCAPE '\\' ". why
>>can't this be done in criteria#generateSQLSearchPattern ?
>
> We cannot just append this to the search pattern, because when the sql
> is actually generated, it is generated with replacement variables (i.e.
> " MYCOLUMN LIKE ? ", so if we do it as part of the
> generateSQLSearchPattern() it will then be included as part of the
> text to search for. We would need the sql statement to look like " MYCOLUMN LIKE ?
> ESCAPE '\\' ".
why can't we add the ESCAPE to the search argument ?
jakob
>
>
>>in this case i would transfer the pattern handling to the new LikeCriteria.
>
> Very good idea!
>
> Paul
>
> -----Original Message-----
> From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
> Sent: Friday, February 20, 2004 1:48 PM
> To: OJB Users List
> Subject: Re: Query with criteria - like using '%' or '_'
>
> hi paul,
>
> Nase, Paul R. wrote:
>
>
>>I don't think there are any platform issues, we aren't talking about
>>path names to look for files or anything like this. We are simply
>>Talking about an SQL92/SQL98 feature that is not being utilized.
>>This character could have been anything, I just so happened to pick
>>the '\' character because this is the most common character used for
>>such a thing.
>
>
> well, we can try it.
>
>>Anyways, I don't think you'll be able to fix this in one place.
>>The string is parsed in one place, and the statement is generated in
>>another. And I don't think there is a way to generate any text -
>>escaping or otherwise - that gives the desired results.
>
>
> i just don't see why we can't construct the whole string in criteria.
> in appendSelectionCriteria you simply append " ESCAPE '\\' ". why can't this be done
> in criteria#generateSQLSearchPattern ?
>
>
>>I admit there is probably a better way to implement this, but the
>>bottom line is - the like feature on the Criteria has a bug. It will
>>not let you build a query to search for a '%' or a '_'.
>>
>>Another way you could implement this is to add another class called
>>LikeCriteria(All the other Criteria have one of these - why not
>>like?). Then add the method SqlQueryStatement.appendLikeCriteria().
>
>
> this is no problem. until now there was no need to treat like separately.
>
>
>>Call the new method in SqlQueryStatement.appendCriteria() when this
>>new LikeCriteria is encountered. But of course, you'd still have to
>>parse the original string appropriately somewhere. So in this case
>>you have 3 files to change - Criteria, a new LikeCriteria, and
>>SqlQueryStatement - instead of 2.
>
>
> in this case i would transfer the pattern handling to the new LikeCriteria.
>
> jakob
>
>>Paul
>>
>>-----Original Message-----
>>From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
>>Sent: Friday, February 20, 2004 11:45 AM
>>To: OJB Users List
>>Subject: Re: Query with criteria - like using '%' or '_'
>>
>>hi paul,
>>
>>i'd prefer to have the whole escape handling in one place, in critria.
>>also i do not know if the escape handling is platform independent.
>>
>>jakob
>>
>>Nase, Paul R. wrote:
>>
>>
>>
>>>It shouldn't matter what db is being used, I should be able to find
>>>any fields containing a '%' or a '_' regardless. The SQL
>>>specification allows for this by allowing the ESCAPE parameter.
>>>
>>>I modified the Criteria.java (generateSqlSearchPattern() method) and
>>>the SqlQueryStatement.java (appendSelectionCriteria() method) source
>>>to implement this the way I feel is appropriate. Look for PRN, to
>>>see any changes I have made.
>>>
>>>In a nutshell, it allows for escaping out the '%' and '_'. When
>>>generating the like clause, adds the " ESCAPE '\\' " parameter, ONLY
>>>when a '\' is found in the pattern value.
>>>
>>>The following code seems to work for me...what do you think?
>>>
>>>Criteria.java
>>> protected String generateSQLSearchPattern(String pattern)
>>> {
>>> StringBuffer sqlpattern = new StringBuffer();
>>>
>>> char[] chars = pattern.toCharArray();
>>> for (int i = 0; i < chars.length; i++)
>>> {
>>> if (chars[i] == '\\')
>>> {
>>> // for the escape character add the next char as is.
>>> // PRN - ADD BEGIN
>>> // find the next non-'\' character.
>>> int x = i+1;
>>> for ( ; (x < chars.length); x++) {
>>> if (chars[x] != '\\') {
>>> break;
>>> }
>>> }
>>> boolean oddEscapes = (((x - i) % 2) > 0) ? true :
>>> false;
>>> if (oddEscapes) {
>>> // only escape characters allowed are '%',
>>> '_', and '\'
>>> // if the escaped character is a '\', then
>>> oddEscapes
>>> // will be false.
>>> // if the character following this last escape
>>> is not a
>>> // '%' or an '_', eat this escape character.
>>> if ((x < chars.length) &&
>>> ((chars[x] == '%') || (chars[x] == '_'))) {
>>> // leave the escape character in,
>>> along with the following char
>>> x++;
>>> } else {
>>> // remove the escape character, will
>>> cause problems in sql statement.
>>> i++; // removing the first escape
>>> character.
>>> if ((x < chars.length) &&
>>> ((chars[x] == '*') || (chars[x] ==
>>> '?'))) {
>>> // but if it is a '*' or a
>>> '?', we want to keep these
>>> // characters as is, they were
>>> 'escaped' out.
>>> x++; // include the first
>>> non-escape character.
>>> }
>>> }
>>> }
>>> if (i < chars.length) sqlpattern.append(chars,i,x - i);
>>> i = x - 1; // set index to last character copied.
>>> // PRN - ADD END
>>> }
>>> else if (chars[i] == '*')
>>> {
>>> sqlpattern.append("%");
>>> }
>>> else if (chars[i] == '?')
>>> {
>>> sqlpattern.append("_");
>>> }
>>> else
>>> {
>>> sqlpattern.append(chars[i]);
>>> }
>>> }
>>> return sqlpattern.toString();
>>> }
>>>
>>>SqlQueryStatement.java
>>> private void appendSelectionCriteria(TableAlias alias, PathInfo pathInfo,
>>> SelectionCriteria c, StringBuffer buf)
>>> {
>>> appendColName(alias, pathInfo, c.isTranslateAttribute(), buf);
>>> buf.append(c.getClause());
>>> appendParameter(c.getValue(), buf);
>>> //PRN - ADD BEGIN
>>> // there is NO functionality to search for something in a like
>>> statement that
>>> // contains the system wildcards ('%' or '_').
>>> Criteria.generateSQLSearchPattern()
>>> // will normalize the string to include the '\' as an escape character
>>> for these
>>> // special cases.
>>> if ((c.getClause().toUpperCase().indexOf("LIKE") >= 0) &&
>>> (((String) c.getValue()).indexOf('\\') >= 0)) {
>>> buf.append(" ESCAPE '\\' ");
>>> }
>>> //PRN - ADD END
>>> }
>>>
>>>Paul
>>>
>>>-----Original Message-----
>>>From: Gelhar, Wallace Joseph [mailto:[EMAIL PROTECTED]
>>>Sent: Friday, February 20, 2004 11:03 AM
>>>To: OJB Users List
>>>Subject: RE: Query with criteria - like using '%' or '_'
>>>
>>>I assumed (AKA ass-u-me) that OJB does a database independent wildcard replacement.
>>> For example, MSSQL uses % as the wildcard character, but ojb will replace a * with
>>>the database specific wildcard character.
>>>This would require some syntax for escaping characters that I'm not sure is present
>>>(ie how do you query for LIKE '*%' where I want to query for all instances where
>>>LIKE '%[%]' on MSSQL) As you can see, this would require database specific
>>>character escaping.
>>>
>>>If you just pass the unaltered string to the db, you some of the database
>>>independence that OJB provides. Although, the cost of implementing this behavior
>>>might outweigh the benefits.
>>>
>>>Thoughts?
>>>
>>>Wally
>>>
>>>-----Original Message-----
>>>From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
>>>Sent: Friday, February 20, 2004 10:41 AM
>>>To: OJB Users List
>>>Subject: Re: Query with criteria - like using '%' or '_'
>>>
>>>
>>>hi paul,
>>>
>>>i'm sorry i forget that ojb manipulates the criteria in addLike. imo
>>>it would be the best to pass the criteria withou any modifications to
>>>the dbms. what do you think about this ?
>>>
>>>jakob
>>>
>>>Nase, Paul R. wrote:
>>>
>>>
>>>
>>>
>>>>Adding a like parameter as the link suggests
>>>>(addLike("attribute","%[%]%")) will return any records where the
>>>>field
>>>
>>>
>>>>matches <anytexthere>[<anytexthere>]<anytexthere>
>>>>(i.e. ABC[DEF]XYZ matches, ABC[XYZ does not).
>>>>
>>>>The only way I have been able to get an sql query to work manually
>>>>is to use a statement similar to:
>>>> select * from sometable where description like '%\%%' ESCAPE '\'
>>>>NOTE: finds all records where the description contains the '%'
>>>>character somewhere.
>>>>
>>>>The first problem with what OJB is doing when I add a like criteria,
>>>>is strip off the escape character. They do this because they are
>>>>only
>>>
>>>
>>>>allowing a '*', '\' or a '?' to be 'escaped', so they assume if you
>>>>are using the '\' character at all, it is simply removed.
>>>>Technically, they aren't really escaping anything, they are simply
>>>>allowing the *, ? and every other \ to go through as is and not
>>>>converting them to their respective % and _ characters. What OJB
>>>>doesn't do when escaping their '*' and '?' - is check to make sure
>>>>the
>>>
>>>
>>>>next character is actually a '*' or '?'. OJB also doesn't add the
>>>>ESCAPE parameter that works with the like clause. They could check
>>>>the value for the like operation for any '\' character, and simply
>>>>append " ESCAPE '\' " if they find one.
>>>>
>>>>So, unless I am missing something, I think the ojb support for 'like'
>>>>is close, but not quite complete. There are basically two
>>>>characters you simply cannot search for in a string, '%' and '_'.
>>>>
>>>>Paul
>>>>
>>>>-----Original Message-----
>>>>From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
>>>>Sent: Thursday, February 19, 2004 12:56 PM
>>>>To: OJB Users List
>>>>Subject: Re: Query with criteria - like using '%' or '_'
>>>>
>>>>hi paul,
>>>>
>>>>check out this link:
>>>>
>>>>http://nick.blogs.com/blog/2003/08/_in_sql_stateme.html
>>>>
>>>>jakob
>>>>
>>>>Nase, Paul R. wrote:
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>>Thanks Jakob,
>>>>>
>>>>>But I want to find objects that contain the actual '%' character, I
>>>>>don't want to search for objects using the '%' as the one or more
>>>>>wildcard.
>>>>>
>>>>>The addLike("attribute","P%") will return all records starting with
>>>>>the letter 'P'. So this query will search using the '%' as the
>>>>>normal
>>>
>>>
>>>>>sql wildcard, it won't query for items that actually contain the '%'
>>>>>character.
>>>>>
>>>>>Paul
>>>>>
>>>>>-----Original Message-----
>>>>>From: Jakob Braeuchi [mailto:[EMAIL PROTECTED]
>>>>>Sent: Thursday, February 19, 2004 12:29 PM
>>>>>To: OJB Users List
>>>>>Subject: Re: Query with criteria - like using '%' or '_'
>>>>>
>>>>>hi paul,
>>>>>
>>>>>use addLike("your_attribute","P%")
>>>>>
>>>>>hth
>>>>>jakob
>>>>>
>>>>>Nase, Paul R. wrote:
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>>I would like to perform a query where a description could have a '%'
>>>>>>or an '_'. Is this possible using QueryByCriteria?
>>>>>>
>>>>>>Example:
>>>>>>ID DESCRIPTION
>>>>>>------- --------------------
>>>>>>10000 40% Member Discount
>>>>>>10001 Online Discount
>>>>>>
>>>>>>I'd like to be able to search using a like statement similar to:
>>>>>>"Where Description like '%\%%' ESCAPE '\'"
>>>>>>
>>>>>>The current implementation will just strip off the escape
>>>>>>character, resulting in passing my literal '\%' being pass as a wildcard.
>>>>>>
>>>>>>Thanks in advance.
>>>>>>
>>>>>>Paul Nase
>>>>>>
>>>>>>------------------------------------------------------------------
>>>>>>-
>>>>>>-
>>>>>>- To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>-------------------------------------------------------------------
>>>>>-
>>>>>- To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>
>>>>>-------------------------------------------------------------------
>>>>>-
>>>>>- To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>>>
>>>>>
>>>>
>>>>
>>>>--------------------------------------------------------------------
>>>>- To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>>
>>>>--------------------------------------------------------------------
>>>>- To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>>
>>>>
>>>
>>>
>>>---------------------------------------------------------------------
>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>>---------------------------------------------------------------------
>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>---------------------------------------------------------------------
>>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>>For additional commands, e-mail: [EMAIL PROTECTED]
>>>
>>>
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: [EMAIL PROTECTED]
>>For additional commands, e-mail: [EMAIL PROTECTED]
>>
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]