Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
2.4.2
-
None
-
None
-
MySQL
Description
Hi,
An exception is thrown in the following method (here the one of ToLowerCase):
when the getValue() is a PCPath and ((PCPath) getValue()).getFieldMapping(state).getColumns()[0])
throws:
java.lang.ArrayIndexOutOfBoundsException: 0{{ org.apache.openjpa.jdbc.kernel.exps.ToLowerCase.appendTo(ToLowerCase.java:47) org.apache.openjpa.jdbc.kernel.exps.MatchesExpression.appendTo(MatchesExpression.java:97) org.apache.openjpa.jdbc.kernel.exps.AndExpression.appendTo(AndExpression.java:59)}}
{{ public void appendTo(Select sel, ExpContext ctx, ExpState state, }}
SQLBuffer buf, int index) {
DBDictionary dict = ctx.store.getDBDictionary();
String func = dict.toLowerCaseFunction;
dict.assertSupport(func != null, "ToLowerCaseFunction");
if (getValue() instanceof PCPath) {
func = dict.getCastFunction(getValue(), func, ((PCPath) getValue()).getFieldMapping(state).getColumns()[0]);
} else {
func = dict.getCastFunction(getValue(), func);
{{ }}}
int idx = func.indexOf("{0}");
buf.append(func.substring(0, idx));
getValue().appendTo(sel, ctx, state, buf, index);
buf.append(func.substring(idx + 3));
{{ }}}
The part of code that generate the exception is:
Path<String> authorPath = from.join("references").join("authors");
predicateList.add(cb.like(cb.lower(authorPath), cb.literal('%' + value + '%')));
If I change this code to use another string function like trim(), it works (ie. the SQL query is correctly generated).
Regards,
Patrice
ps: remark that the only uses of DBDictionary.getCastFunction(Val val, String func, Column col) are for those classes.