JDBC类型没有方言映射:带有Hibernate 4和SQL Server 2012的-9 [英] No Dialect mapping for JDBC type: -9 with Hibernate 4 and SQL Server 2012

查看:118
本文介绍了JDBC类型没有方言映射:带有Hibernate 4和SQL Server 2012的-9的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using the latest Hibernate 4.2.7.SP1 along with the entity-manager, and validator, etc. I am using he 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是一个视图,"account_name"字段是NVARCHAR(120)

FYI: MY_VIEW_RECEIVABLES is a view, and the "account_name" field is a NVARCHAR(120)

我遇到的问题是:

org.springframework.orm.hibernate4.HibernateSystemException:否JDBC类型的方言映射:-9;嵌套的异常是org.hibernate.MappingException:没有JDBC类型的方言映射:-9
在org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:185)

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)

在搜索过程中,我明白了,方言无法确定数据类型,因此我必须添加标量映射...但是我尝试通过添加以下内容来进行尝试:

As my search goes, I get it, the dialect can't determine the data types and so I have to add the Scalar mapping ... however I tried that just by adding:

q.addScalar("account");

但这没用.

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

Several solutions show that I should create a class such as:

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

I then change my hibernate.properties file:

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

这仍然行不通.任何将我引向Hibernate.STRING的帮助,这些常量都不存在.

And this still isn't working. Any help which refers me to Hibernate.STRING, these constants do not exist.

在此方面的任何帮助将不胜感激.谢谢!

Any help with this would be much appreciated. Thanks!

推荐答案

此问题无需花费太多时间来解决.首先,hibernate.dialect仍然是:

This didn't take too much to fix. First, the hibernate.dialect is still:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect

.addScalar"起作用了,但是对于Hibernate 4,我不得不使用"StandardBasicTypes"类,如下所述.

And the ".addScalar" worked, but for Hibernate 4, I had to use the "StandardBasicTypes" class as described below.

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

这是添加参数的标准:

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

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

And finally, I still needed this transformer:

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

我希望这可以帮助其他人.

I hope this helps someone else out.

这篇关于JDBC类型没有方言映射:带有Hibernate 4和SQL Server 2012的-9的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆