我一直在尝试在项目中使用来自http://code.google.com/p/hibernate-sqlite/的SQLite的hibernate方言,但遇到了类似以下内容的问题......
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...
}
不幸的是,取消注释null映射的明显步骤似乎并未改变行为。
可以指出我做错了什么,建议如何修复方言,或者推荐任何有关编写Hibernate方言的资源吗?
答案 0 :(得分:3)
有趣。抛出异常是因为Dialect找不到合适的 hibernate 类型而不是列类型;您通常会使用registerHibernateType()
方法进行注册。
但是,你不能用Types.NULL做到这一点,因为没有相应的Hibernate类型(NULL确实表示开始的“通用”类型)。而且我认为这不是问题的根源。
我从未使用SQLite,但您的查询:
select id from collection where collection = (:collection_name)
看起来很好奇;这绝对不是标准的SQL。对于未映射的SQL查询,Hibernate尝试使用元数据自动检测结果类型,在这种情况下它不能(可能因为SQLite元数据不能提供正确的类型信息?)
可能的解决方法是:
SQLQuery.addScalar(alias, Type)
明确指定结果类型。