2010-02-24 96 views
3

我正在运行Hibernate 3.2.0和MySQL 5.1。在更新MySQL中的group_concat_max_len之后(因为group_concat查询超过了默认值),当执行带有group_concat子句的SQLQuery时,我得到以下异常:在Hibernate 3.2中没有映射LONGVARCHAR

“没有用于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查询,但是我必须用SQL语句的每个实例替换为group_concat子句。

其他建议?

回答

2

是的,有两点建议。或者:

  1. 补丁休眠3.2.0与HHH-3892的变化即获得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()); 
        }  
    } 
    

选项#2是容易实现并测试(我没有),而选项#1是“清洁”,但需要(一点)更多的工作。就我个人而言,我会选择#1选项,因为这将是您将获得的3.5,从而保证了无缝升级。

1

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

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

+0

+1感谢这一点,我在查询中使用了group_concat,并在所有返回值上使用了addScalar解决了这个问题。 – 2010-09-23 18:03:28

+0

嗨...你有什么想法'为什么'这可以缓解这个问题? – Victor 2011-03-04 21:49:44