Hibernate如何映射SQL数据类型nvarchar(max)?

amp*_*dre 11 varchar hibernate nvarchar sql-server-2005

我的SQL-2005数据库中有一列曾经是varchar(max),但它已被更改为nvarchar(max).

现在我需要更新我的hibernate映射文件以反映更改,这就是以前的情况:

<element type ="text"column ="Value"/>

当我尝试运行该应用程序时,出现以下错误:

org.hibernate.HibernateException:列值为[表]中的列类型错误.找到:ntext,expected:text

我应该在'type'属性中将该列正确映射为nvarchar(max)

我已经尝试将类型设置为ntext,但是hibernate不知道那是什么.我尝试将类型设置为字符串,但它将字符串视为文本类型.

小智 16

对我有用的是将实际的列定义放在@Column注释中:

    @Column(name="requestXml", columnDefinition = "ntext")
private String request;
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有用.我在DB中使用nvarchar(max)和@Column(name ="colName",columnDefinition ="nvarchar")修复它. (3认同)

amp*_*dre 7

Tremend Tech Blog找到答案.你必须编写自己的SQLServerDialect类,它看起来像这样:

public class SQLServerNativeDialect extends SQLServerDialect {
     public SQLServerNativeDialect() {
         super();
         registerColumnType(Types.VARCHAR, "nvarchar($l)");
         registerColumnType(Types.CLOB, "nvarchar(max)");
     }

    public String getTypeName(int code, int length, int precision, int scale) throws HibernateException {
        if(code != 2005) {
            return super.getTypeName(code, length, precision, scale);
        } else {
            return "ntext";
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此类将Hibernate的类型映射到SQL类型,因此该类将nvarchar(max) SQL数据类型映射 到Hibernate的CLOB数据类型.

当Hibernate使用代码2005(它看起来像是nvarchar(max)数据类型)询问数据类型时,getTypeName方法用于返回"ntext".

最后,您需要将hibernate持久化方言更改为这个新的SQLServerDialect类,它允许hibernate将数据类型转换为SQL数据类型.

  • 你为什么注册列类型COLB?这个$ 1在nvarchar($ 1)中意味着什么?谢谢 (3认同)

Art*_*iev 5

可以通过@Nationalized 休眠中的注释来修复,该 注释标记字符数据类型,例如国家化的变体(NVARCHAR,NCHAR,NCLOB等)。