在Hibernate 3.2中没有映射LONGVARCHAR
我正在运行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子句。
其他建议?
是的,有两点建议。或者:
补丁休眠3.2.0与HHH-3892的变化即获得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,从而保证了无缝升级。
帕斯卡的回答听起来很不错,但现在我采取了一条捷径。
为每个查询返回值调用addScalar也缓解了这个问题。事实证明,我的代码中没有很多地方使用group_concat,但没有显式调用addScalar。添加这些使问题消失。 (请注意,您必须为每个返回值调用addScalar,而不仅仅是来自group_concat的调用。)
+1感谢这一点,我在查询中使用了group_concat,并在所有返回值上使用了addScalar解决了这个问题。 – 2010-09-23 18:03:28
嗨...你有什么想法'为什么'这可以缓解这个问题? – Victor 2011-03-04 21:49:44