Я пытался использовать 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...
}
К сожалению, очевидный шаг раскомментирования отображения для нуля, похоже, не меняет поведение.
Может ли кто-нибудь указать, что я делаю неправильно, предложить, как исправить диалект, или порекомендовать какие-либо полезные ресурсы для чтения по написанию спящего диалекта?