Eeek—I actually did it, and it works like a charm! Found out my factory needed 
to override getConditionTranslator(), not getSelectTranslator().

https://gist.github.com/hugith/f04fd044b59c4ce60aa9

For the first time, I feel like a total Cayenne Boss™ :)

- hugi



> On 13. okt. 2015, at 14:45, Hugi Thordarson <h...@karlmenn.is> wrote:
> 
>> {fn ucase} is JDBC escape syntax, so presumably the driver should convert 
>> that to the proper syntax. If a given driver is not capable of doing that, 
>> that has to be addressed in DbAdapter for that DB. 
>> DbAdapter.getEjbqlTranslatorFactory() is how you customize EJBQL 
>> translation. So Mike is right about that.
> 
> Thanks… I’ve created my adaptor and ensured that it’s being used along with 
> my new InformixEJBQLSelectTranslator—but I’m not getting any invocations of 
> visitUpper and the code generated still contains {fn ucase(…)}. Shouldn’t 
> visitUpper() be where I hook into the generation of the upper statement for 
> the DB?
> 
> https://gist.github.com/hugith/bb68f1944f7a7d754363
> 
>> BTW, which DB are we talking about?
> 
> Ah, well… It’s informix— and an old version at that. So I would probably 
> always have had to create my own DbAdaptor anyway.
> 
> Cheers,
> - hugi
> 
> 
>> 
>> Andrus
>> 
>> 
>>> On Oct 13, 2015, at 5:31 AM, Hugi Thordarson <h...@karlmenn.is> wrote:
>>> 
>>> Thanks Mike!
>>> 
>>> I’m not sure it this is a database plugin problem though. Doing regular 
>>> case insensitive queries works fine, it’s only queries created from EJBQL 
>>> that fail. Also, the only place in the Cayenne sources I can find a mention 
>>> of “ucase" is in EJBQLTranslator’s visitUpper(). Perhaps changing that 
>>> method to do upper( rather than {fn ucase. might solve the problem? I’m 
>>> going to try that out :).
>>> 
>>> https://github.com/apache/cayenne/blob/master/cayenne-server/src/main/java/org/apache/cayenne/access/translator/ejbql/EJBQLConditionTranslator.java#L1058
>>> 
>>> Cheers,
>>> - hugi
>>> 
>>> 
>>> 
>>> 
>>>> Sounds like the DbAdaptor for that database needs to be special-cased.
>>>> Lots of examples of how this is done in cayenne/dba/<database>/*,
>>>> especially for oracle
>>>> 
>>>> And it's pretty simple to set your app up to use a custom version of
>>>> the dbAdaptor if you don't want to build your own custom version of
>>>> cayenne while you wait until it's included in a release.
>>>> 
>>>> On Mon, Oct 12, 2015 at 12:46 PM, Hugi Thordarson <h...@karlmenn.is> wrote:
>>>>> Hi all.
>>>>> 
>>>>> I’m communicating with a database that doesn’t have the UCASE function, 
>>>>> only UPPER.
>>>>> 
>>>>> When I use case insensitive expressions (for example, 
>>>>> User.NAME.likeIgnoreCase(“Bob”)) in a regular SelectQuery, Cayenne 
>>>>> generates SQL using the “UPPER” function (for expressions generated using 
>>>>> likeIgnoreCase). This works fine.
>>>>> 
>>>>> But if I generate EJBQL from the expression and then use the resulting 
>>>>> string to perform an EJBQLQuery, Cayenne will attempt to use UCASE 
>>>>> function in the resulting SQL and things go awry.
>>>>> 
>>>>> Can I tell the EJBQL SQL translator to use “upper” rather than “ucase” 
>>>>> when performing these queries?
>>>>> 
>>>>> Cheers,
>>>>> - hugi
>>> 
>>> 
>> 
> 

Reply via email to