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

Sql server 2005 Hibernate如何映射SQL数据类型nvarchar(max)?,sql-server-2005,hibernate,varchar,nvarchar,Sql Server 2005,Hibernate,Varchar,Nvarchar,我的SQL-2005数据库中有一个列,以前是varchar(max),但现在已改为nvarchar(max) 现在我需要更新我的hibernate映射文件以反映更改,这就是它过去的样子: 尝试运行应用程序时,出现以下错误: org.hibernate.hibernateeexception:[表]中列值的列类型错误。找到:ntext,应为:text 我应该在“type”属性中添加什么才能将列正确映射为nvarchar(max) 我尝试将类型设置为ntext,但hibernate不知道是什么。我

我的SQL-2005数据库中有一个列,以前是varchar(max),但现在已改为nvarchar(max)

现在我需要更新我的hibernate映射文件以反映更改,这就是它过去的样子:

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

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

我应该在“type”属性中添加什么才能将列正确映射为nvarchar(max)

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

在找到答案。您必须编写自己的SQLServer方言类,它看起来像这样:

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";
        }
    }
}
该类将Hibernate的类型映射到SQL类型,因此该类将把nvarchar(max)SQL数据类型映射到Hibernate的CLOB数据类型

当Hibernate询问代码为2005的数据类型时,使用getTypeName方法返回“ntext”(看起来是nvarchar(max)数据类型)

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

我认为是这样
registerColumnType(Types.VARCHAR,“nvarchar($l)”);//我喜欢长度,而不是1。

对我来说,有效的方法是将实际的列定义放在@column注释中:

    @Column(name="requestXml", columnDefinition = "ntext")
private String request;
可以通过以下方式进行修复:
@国有化

来自hibernate的注释,它将字符数据类型标记为国家化的变体(NVARCHAR、NCHAR、NCLOB等)。

为什么还要注册列类型COLB?这1美元在nvarchar($1)中意味着什么?感谢这是很久以前的事了,我记不清了,但是registerColumnType()将SQL类型映射到Hibernate类型$l(l,不是#1)是表示nvarchar列长度的匹配模式。如果nvarchar列具有定义的长度,则它将映射到VARCHAR类型。如果nvarchar列具有最大长度,则它将映射到CLOB类型。请注意,对于sql server 2014,我必须删除上面代码中重写的方法
getTypeName
!!这对我也有用。我在DB中使用了nvarchar(max),并且@Column(name=“colName”,columnDefinition=“nvarchar”)修复了它。它是$1。例如registerColumnType(Types.NVARCHAR,4000,“NVARCHAR($1)”);