Ошибка диалекта SQLite в Hibernate - PullRequest
0 голосов
/ 28 октября 2009

Я пытался использовать hibernate-диалект для SQLite из http://code.google.com/p/hibernate-sqlite/ в проекте, но столкнулся с проблемой с чем-то вроде следующего ...

    SQLQuery query = session
            .createSQLQuery("select id from collection where collection = (:collection_name);");

    query.setParameter("collection_name", collectionName);
    Integer collectionId = (Integer) query.uniqueResult();

Я ожидаю, что если для моего запроса не будет подходящей строки, для этого collectionId будет установлено значение null. То, что я на самом деле получаю, является исключением следующего:

Exception in thread "main" org.hibernate.MappingException: No Dialect mapping for JDBC type: 0
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:79)
    at org.hibernate.dialect.TypeNames.get(TypeNames.java:104)
    at org.hibernate.dialect.Dialect.getHibernateTypeName(Dialect.java:395)
    at org.hibernate.loader.custom.CustomLoader$Metadata.getHibernateType(CustomLoader.java:582)
    at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.performDiscovery(CustomLoader.java:508)
    at org.hibernate.loader.custom.CustomLoader.autoDiscoverTypes(CustomLoader.java:524)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1821)
    at org.hibernate.loader.Loader.doQuery(Loader.java:697)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
    at org.hibernate.loader.Loader.doList(Loader.java:2232)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
    at org.hibernate.loader.Loader.list(Loader.java:2124)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1657)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175)
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:835)
    at uniqueResult line of code above.

Посмотрев на реальный диалект, это не совсем удивительно, так как похоже, что JDBC тип 0 равен нулю, а диалект содержит следующую функцию с закомментированным нулевым отображением ...

public SQLiteDialect() {
    super();
    registerColumnType(Types.BIT, "integer");
                // ...lots more type registers...
    registerColumnType(Types.LONGVARBINARY, "blob");
    // registerColumnType(Types.NULL, "null");
    registerColumnType(Types.BLOB, "blob");
                // ...more column types and function registers...
}

К сожалению, очевидный шаг раскомментирования отображения для нуля, похоже, не меняет поведение.

Может ли кто-нибудь указать, что я делаю неправильно, предложить, как исправить диалект, или порекомендовать какие-либо полезные ресурсы для чтения по написанию спящего диалекта?

1 Ответ

3 голосов
/ 28 октября 2009

Интересно. Исключение выдается, потому что Dialect не может найти соответствующий тип hibernate вместо типа столбца; обычно вы используете registerHibernateType() метод для его регистрации.

Однако вы не можете сделать это с Types.NULL, потому что нет соответствующего типа Hibernate (NULL действительно означает «универсальный» тип для начала). И я не думаю, что это является источником проблемы.

Я никогда не работал с SQLite, но ваш запрос:

select id from collection where collection = (:collection_name)

выглядит довольно любопытно; это определенно не стандартный SQL. Для несопоставленных SQL-запросов Hibernate пытается автоматически определить тип результата, используя метаданные, и в этом случае не может (возможно, потому что метаданные SQLite не предоставляют правильную информацию о типе?)

Возможные обходные пути:

  1. Используйте SQLQuery.addScalar(alias, Type), чтобы явно указать тип результата.
  2. Перепишите ваш запрос как HQL, если это возможно; Ваши сопоставления сущностей предоставят необходимую информацию о типах.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...