SQLSyntaxErrorException: ORA-00932: несовместимые типы данных: ожидается, что DATE получил BINARY - PullRequest
2 голосов
/ 04 апреля 2019

Буду признателен за помощь в этом исключении.

Я провел некоторое исследование этой ошибки, но не смог найти решение.Я использую JPA с hibernate и получаю эту ошибку при выполнении запроса.

Очевидно, что я чего-то не понимаю в java LocalDate и oracle Date.: (

Это объект:

@Entity
@Table(name = "MY_TABLE")
public class MyObject implements Serializable {

    private static final long serialVersionUID = 1731972128723930612L;

    @Id
    @OneToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "OTHER_ID", nullable = false)
    private OtherObject otherObject;

    @Column(name = "MY_DATE", columnDefinition="DATE", nullable = false)
   // @Convert(converter = LocalDateSQLDateConverter.class)
   // @Convert(converter = LocalDateConverter.class)
    private LocalDate date;

Как вы можете видеть, я пытался использовать конвертеры, которые конвертируют LocalDate в java.util.Date или java.sql.Date и наоборот -оба, к сожалению, не помогли.

Это запрос:

public class MyDao extends BaseDao {

    public void save(MyObject object) {
        entityManager.persist(object);
    }

    public MyObject findByDate(LocalDate date) {
        TypedQuery<MyObject> query = entityManager.createQuery("SELECT w from MyObject w"
                + " where w.date = :date", MyOBject.class)
                .setParameter("date", date);
        return query.getResultList().stream().findFirst().orElse(null);
    }

Это исключение:

java.sql.SQLSyntaxErrorException: ORA-00932:несовместимые типы данных: ожидаемая ДАТА получила БИНАРНЫЙ

oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.java:445) oracle.jdbc.driver.T4CTTIoer.processError (T4CTTIoer.drijj.jj_64: 39).T4C8Oall.processError (T4C8Oall.java:879)..doOALL (T4C8Oall.java:531) oracle.jdbc.driver.T4CPreparedStatement.doOall8 (T4CPreparedStatement.java:207) oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe (T4CP)(OracleStatement.java:1167) oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.java:1289) oracle.jdbc.driver.oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery (OraclePreparedStatementWrapper.java:1493) org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.ResultSetReturnImpl.java:79) org.hibernate.loader.Loader.getResultSet (Loader.java:2090) org.hibernate.loader.Loader.executeQueryStatement (Loader.java:1887) org.hibernate.loader.Loader.State ()Java: 1866) org.hibernate.loader.Loader.doQuery (Loader.java:905) org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections (Loader.java:347) org.hibernate.loader.Loader.doList (2578) org.hibernate.loader.Loader.doList (Loader.java: 2564) org.hibernate.loader.Loader.listIgnoreQueryCache (Loader.java:2394) org.hibernate.loader.Loader.list (Loader.java:2389) org.hibernate.loader.hql.QueryLoader.list (QueryLoader.Java: 495) org.hibernate.hql.internal.ast.QueryTranslatorImpl.list (QueryTranslatorImpl.java:357) org.hibernate.engine.query.spi.HQLQueryPlan.performList (HQLQueryPlan.java:19ternal.in.h.in.g.SessionImpl.list (SessionImpl.java:1230) org.hibernate.internal.QueryImpl.list (QueryImpl.java:101) org.hibernate.ejb.QueryImpl.getResultList (QueryImpl.java:268) my.companyDpath.findByDate (MyDaoDao.java:21)

Заранее большое спасибо за любые подсказки!

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Hibernate 4 вышел до java.time.LocalDate и не понимает его.Поэтому он отправляет данные в двоичном виде в Oracle.

Лучшим решением является обновление до Hibernate 5.

0 голосов
/ 25 апреля 2019

Я обнаружил, что наш образ докера использует JBoss 6.4, который - согласно https://access.redhat.com/articles/112673 - использует Hibernate JPA 2.0 .

Так что это не может работать. Нам нужно JPA 2.2 для поддержки LocalDate & LocalDateTime.

Я изменил все вхождения LocalDate и LocalDateTime в DAO с помощью Date, в то время как остальная часть моего приложения продолжает использовать LocalDate и LocalDateTime - с помощью небольшого конвертера:

public class LocalDateConverter {

    public static Date convertToDate(LocalDate date) {
        return date != null ? Date.from(date.atStartOfDay(ZoneId.systemDefault()).toInstant()) : null;
    }

    public static LocalDate convertToLocalDate(Date date) {
        return date != null ? LocalDate.from(date.toInstant().atZone(ZoneId.systemDefault())) : null;
    }

    public static Date convertToDate(LocalDateTime dateTime) {
        return dateTime != null ? Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant()) : null;
    }
}

Теоретически, отсутствует один метод, который преобразует Date в LocalDateTime, но в моем случае он мне не нужен, потому что я использую LocalDateTime только для creationDates, которые никогда не читаются.

0 голосов
/ 04 апреля 2019

Хотя это кажется противоинтуитивным, вы должны передать строковое представление, например:

SELECT * FROM xxx where date_of_birth = '1990-08-21';

, где date_of_birth имеет тип DATE (MySQL, а не Oracle, ноне имеет значения) и отображается на LocalDate в Spring / Hibernate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...