Eclipselink не преобразует oracle.sql.TIMESTAMPTZ - PullRequest
0 голосов
/ 10 июля 2019

Я получаю сообщение об ошибке при извлечении значения из БД с использованием 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;
    }
...