在Hibernate 3.2中没有LONGVARCHAR的映射

时间:2010-02-24 15:00:43

标签: java mysql hibernate orm jdbc

我正在使用MySQL 5.1运行Hibernate 3.2.0。更新MySQL中的group_concat_max_len(因为group_concat查询超过了默认值),在使用group_concat子句执行SQLQuery时出现以下异常:

“JDBC类型没有Dialect映射:-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的每个实例。

还有其他建议吗?

2 个答案:

答案 0 :(得分:2)

是的,两个建议。之一:

  1. 使用HHH-3892的更改来修补Hibernate 3.2.0,即获取Hibernate源,应用r16501r16823r17332的补丁并构建Hibernate自己。

  2. 或使用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());
        }    
    }
    
  3. 选项#2易于实现和测试(我没有),而选项#1是“更干净”但需要(一点点)更多的工作。就个人而言,我选择#1选项,因为这是你将获得的3.5,从而保证无缝升级。

答案 1 :(得分:1)

帕斯卡的回答听起来很不错,但我现在采取了一条捷径。

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