Я получаю сообщение об ошибке при извлечении значения из БД с использованием Eclipselink в качестве поставщика сохраняемости. Не преобразует oracle.sql.TIMESTAMPTZ в java.sql.Timestamp или java.util.Date .
Query q = em.createNativeQuery("SELECT * FROM MY_Schema.MyTable MT WHERE MT.START_DT = (SELECT MAX(START_DT) FROM MY_Schema.MyTable)",MyTable.class);
@Entity
@Table(name = "MyTable", schema = "MY_Schema")
public class MyTable implements Serializable {
@EmbeddedId
private MyTableId id;
@Embeddable
public class MyTableId implements Serializable {
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "END_DT")
private Calendar endTime;
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "START_DT")
private Calendar startTime;
Исключение
Причина: Исключение [EclipseLink-3001] (Eclipse Persistence Services- 2.6.8.WAS-v20181218-0accd7f): org.eclipse.persistence.exceptions.ConversionException ExceptionDescription: Объект [oracle.sql.TIMESTAMPTZ@6156ebf7] из класса [class oracle.sql.TIMESTAMPTZ] не может быть преобразован в [класс java.sql.Timestamp],в org.eclipse.persistence.exceptions.ConversionException.couldNotBeConverted (ConversionException.java:78) в org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToTimest mp (ConversionManager.java:751) в org.ec.helper.ConversionManager.convertObject (ConversionManager.java:112)
Вещи, которые я нашел
Во время отладки я обнаружил, что в классе eclipselink ConversionManager нет обработки для oracle.sql.TIMESTAMPTZ.Это напрямую вызывает исключение в этом методе.
/**
* INTERNAL:
* Build a valid instance of java.sql.Timestamp from the given source object.
* @param sourceObject Valid object of class java.sql.Timestamp, String, java.util.Date, or Long
*/
protected java.sql.Timestamp convertObjectToTimestamp(Object sourceObject) throws ConversionException {
java.sql.Timestamp timestamp = null;
if (sourceObject instanceof java.sql.Timestamp) {
return (java.sql.Timestamp)sourceObject;// Helper timestamp is not caught on class check.
}
if (sourceObject instanceof String) {
timestamp = Helper.timestampFromString((String)sourceObject);
} else if (sourceObject instanceof java.util.Date) {// This handles all date and subclasses, sql.Date, sql.Time conversions.
timestamp = Helper.timestampFromDate((java.util.Date)sourceObject);
} else if (sourceObject instanceof Calendar) {
return Helper.timestampFromCalendar((Calendar)sourceObject);
} else if (sourceObject instanceof Long) {
timestamp = Helper.timestampFromLong((Long)sourceObject);
} else {
throw ConversionException.couldNotBeConverted(sourceObject, ClassConstants.TIMESTAMP);
}
return timestamp;
}