我正在使用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的每个实例。
还有其他建议吗?
答案 0 :(得分: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,从而保证无缝升级。
答案 1 :(得分:1)
为每个查询返回值调用addScalar也可以缓解此问题。事实证明,我的代码中有很多地方没有group_concat但没有显式调用addScalar。添加这些会使问题消失。 (请注意,您必须为每个返回值调用addScalar,而不仅仅是来自group_concat的那些。)