Hibernate 3.2 中没有 LONGVARCHAR 的映射

Posted

技术标签:

【中文标题】Hibernate 3.2 中没有 LONGVARCHAR 的映射【英文标题】:No mapping for LONGVARCHAR in Hibernate 3.2 【发布时间】:2011-01-20 13:56:16 【问题描述】:

我正在运行带有 mysql 5.1 的 Hibernate 3.2.0。在 MySQL 中更新 group_concat_max_len 后(由于 group_concat 查询超出了默认值),在执行带有 group_concat 子句的 SQLQuery 时出现以下异常:

"没有 JDBC 类型的方言映射:-1"

-1 是 LONGVARCHAR 的 java.sql.Types 值。显然,增加 group_concat_max_len 值会导致对 group_concat 的调用返回 LONGVARCHAR 值。这似乎是此错误的一个实例:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-3892

我猜在 Hibernate 3.5 中已经修复了这个问题,但这仍然是一个开发版本,所以我很犹豫是否将它投入生产,并且不知道它是否会导致我的代码的其他部分出现问题根据。我也可以只使用 JDBC 查询,但是我必须用 group_concat 子句替换 SQLQuery 的每个实例。

还有其他建议吗?

【问题讨论】:

【参考方案1】:

Pascal 的回答听起来很不错,但我现在走捷径了。

为每个查询返回值调用 addScalar 也可以缓解这个问题。事实证明,我的代码中没有很多地方使用 group_concat,但没有显式调用 addScalar。添加这些可以使问题消失。 (请注意,您必须为每个返回值调用 addScalar,而不仅仅是来自 group_concat 的那些。)

【讨论】:

+1 谢谢,我在查询中使用了 group_concat 并在所有返回值上使用 addScalar 解决了这个问题。 嗨...您知道“为什么”这可以缓解问题吗?【参考方案2】:

是的,有两个建议。要么:

    使用HHH-3892 的更改为Hibernate 3.2.0 打补丁,即获取Hibernate 源,应用r16501、r16823 和r17332 的补丁并自己构建Hibernate。

    李>

    或者使用HHH-1483中建议的自定义方言:

    public class MySQL5Dialect extends org.hibernate.dialect.MySQL5Dialect 
        public MySQL5Dialect() 
            super();
            // register additional hibernate types for default use in scalar sqlquery type auto detection
            // http://opensource.atlassian.com/projects/hibernate/browse/HHH-1483
            registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName());
            
    
    

选项#2 易于实现和测试(我没有),而选项#1 是“更干净”但需要(一点)更多的工作。就我个人而言,我会选择选项 #1,因为这就是 3.5 所获得的,因此可以保证无缝升级。

【讨论】:

以上是关于Hibernate 3.2 中没有 LONGVARCHAR 的映射的主要内容,如果未能解决你的问题,请参考以下文章

搭建SpringMVC+Spring4.3.2+Hibernate5.2.2框架

spring-orm 3.2 需要不同的 JtaPlatform 包,而不是 hibernate-core 4.3

事务不适用于 Spring 3.1 – H2 – junit 4 – hibernate 3.2

通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

带有 Hibernate 4.3.6 的 HSQLDB 2.3.2 中的语法错误

基于struts2.5.2+hibernate5.2.2+spring4.3.2搭建SSH框架