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)