gpt4 book ai didi

java - Hibernate 的 SQLite 方言错误

转载 作者:行者123 更新时间:2023-12-02 00:54:10 28 4
gpt4 key购买 nike

我一直在尝试使用 SQLite 的 hibernate 方言 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 为 null,并且该方言包含以下函数,并且注释掉了 null 映射...

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 方言的好资源吗?

最佳答案

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

关于java - Hibernate 的 SQLite 方言错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1635041/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com