java - 没有 JDBC 类型 : -9 with Hibernate 4 and SQL Server 2012 的方言映射

标签 java sql sql-server jdbc hibernate-mapping

我正在使用最新的 Hibernate 4.2.7.SP1 以及实体管理器和 validator 等。我正在使用 Microsoft SQL Server 2012。

我尝试使用的代码是:

StringBuffer sb = new StringBuffer();
sb.append("SELECT vr.account_name as account FROM MY_VIEW_RECEIVABLES vr;");
String sql = sb.toString();
System.out.println("MyInvoiceDAO: getInvoices: SQL=" + sql);
SQLQuery q = this.sessionFactory.getCurrentSession().createSQLQuery(sql);
q.addScalar("account");
q.setResultTransformer(Transformers.aliasToBean(InvoiceDTO.class));
List results = q.list();

仅供引用:MY_VIEW_RECEIVABLES 是一个 View ,“account_name”字段是 NVARCHAR(120)

我遇到的问题是:

org.springframework.orm.hibernate4.HibernateSystemException: No Dialect mapping for JDBC type: -9; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -9
at org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:185)

随着我的搜索,我明白了,方言无法确定数据类型,所以我必须添加标量映射......但是我尝试通过添加:

q.addScalar("account");

但这没有用。

几个解决方案表明我应该创建一个类,例如:

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.properties 文件:

From:  hibernate.dialect=org.hibernate.dialect.SQLServerDialect
  To:  hibernate.dialect=com.myapp.test.utils.SQLServerNativeDialect

这仍然不起作用。任何将我引向 Hibernate.STRING 的帮助,这些常量都不存在。

对此的任何帮助将不胜感激。谢谢!

最佳答案

修复这个问题并不需要太多时间。首先,hibernate.dialect仍然是:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect

“.addScalar”有效,但对于 Hibernate 4,我必须使用“StandardBasicTypes”类,如下所述。

    q.addScalar("currency", StandardBasicTypes.STRING);
    q.addScalar("amount", StandardBasicTypes.BIG_DECIMAL);
    q.addScalar("age", StandardBasicTypes.INTEGER);

这是添加参数的标准:

    q.setParameter("age", age);
    q.setParameter("customerId", customerId);

最后,我仍然需要这个变压器:

    q.setResultTransformer(Transformers.aliasToBean(MyDTO.class));
    List<MyDTO> results = q.list();

我希望这对其他人有帮助。

关于java - 没有 JDBC 类型 : -9 with Hibernate 4 and SQL Server 2012 的方言映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20149627/

相关文章:

线程终止时的 Java ExecutorService 回调

java - 如果添加null,ArrayList会动态增长吗?

sql-server - 如何在 Visual Studio 2012 Web Express 中提交数据库表更改?

sql - 获取每个品牌每小时的销售额sql

python - 使用python将数据插入MSSQL服务器

java - 将现有 POJO 对象存储在 Firebase 数据库中的最佳实践

java - 哪个是Java中更好的做法

mysql - 获取给定用户的权限

MySQL - 从前一行中减去值,分组

mysql - 获取 MySQL 数据库中每个团队的最后 6 条记录