Hi,

I have created a custom mapping in my entity classes to map java Date
objects to a nonstandard Date object. (JodaTime)  This mapping uses a
ValueHandler to implement the conversion, and @Strategy annotation on the
fields to indicate that this handler should be used.

The conversion works as expected except in queries with MIN or
MAX(dateFieldToConvert), where it dies with a ClassCastException in the
OpenJPA code without ever attempting to call my handler.


Here is the stack trace of the failure:
===========================================================
Caused by: java.lang.ClassCastException: Cannot convert object "12/1/12
12:00 AM" of type "class java.sql.Date" into an instance of "class
org.joda.time.LocalDate".
        at org.apache.openjpa.kernel.Filters.convert(Filters.java:336)
        at org.apache.openjpa.kernel.Filters.convert(Filters.java:265)
        at org.apache.openjpa.jdbc.kernel.exps.UnaryOp.load(UnaryOp.java:125)
        at
org.apache.openjpa.jdbc.kernel.ProjectionResultObjectProvider.getResultObject(ProjectionResultObjectProvider.java:78)
        at
org.apache.openjpa.kernel.QueryImpl$PackingResultObjectProvider.getResultObject(QueryImpl.java:2075)
        at org.apache.openjpa.kernel.QueryImpl.singleResult(QueryImpl.java:1330)
        at org.apache.openjpa.kernel.QueryImpl.toResult(QueryImpl.java:1242)
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:1007)
        at org.apache.openjpa.kernel.QueryImpl.execute(QueryImpl.java:863)
        ... 33 more
===========================================================



And here is the ValueHandler implementation code I am using:
===========================================================
public class LocalDateValueHandler extends AbstractValueHandler {
...
        @Override
        public Object toDataStoreValue(ValueMapping vm, Object val, JDBCStore
store) {
                if (val instanceof LocalDate) {
                        return convertLocalDate((LocalDate) val);
                } else if (val instanceof String) {
                        return convertLocalDate(format.parseDateTime((String)
val).toLocalDate());
                } else {
                        return val;
                }
        }
        
        @Override
        public Object toObjectValue(ValueMapping vm, Object val) {
                if (val instanceof Date) {
                        Date date = (Date) val;
                        return new LocalDate(date);
                } else {
                        return val;
                }
        }

        @Override
        public Column[] map(ValueMapping vm, String name, ColumnIO io, boolean
adapt) {
                DBDictionary dict = vm.getMappingRepository().getDBDictionary();
                DBIdentifier colName = DBIdentifier.newColumn(name, dict != 
null ?
dict.delimitAll() : false);
                return map(vm, colName, io, adapt);
        }

        private Column[] map(ValueMapping vm, DBIdentifier name, ColumnIO io,
boolean adapt) {
                Column col = new Column();
                col.setIdentifier(name);
                col.setJavaType(JavaSQLTypes.SQL_DATE);
                col.setType(Types.DATE);
                return new Column[] { col };
        }
...
}
===========================================================

Any help would be appreciated.

Thanks,

Justin



--
View this message in context: 
http://openjpa.208410.n2.nabble.com/Custom-field-mapping-fails-with-MAX-query-tp7582965.html
Sent from the OpenJPA Users mailing list archive at Nabble.com.

Reply via email to