Hibernate的SQLite方言错误

时间:2009-10-28 03:24:53

标签: java hibernate sqlite

我一直在尝试在项目中使用来自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方言的资源吗?

1 个答案:

答案 0 :(得分:3)

有趣。抛出异常是因为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;您的实体映射将提供必要的类型信息。