JDBC类型的无方言映射:-9与Hibernate 4和SQL Server 2012

tjh*_*s66 2 java sql sql-server jdbc hibernate-mapping

我正在使用最新的Hibernate 4.2.7.SP1以及实体管理器和验证器等.我使用的是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();
Run Code Online (Sandbox Code Playgroud)

仅供参考:MY_VIEW_RECEIVABLES是一个视图,"account_name"字段是一个NVARCHAR(120)

我得到的问题是:

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

正如我的搜索,我得到它,方言无法确定数据类型,因此我必须添加标量映射...但是我尝试通过添加:

q.addScalar("account");
Run Code Online (Sandbox Code Playgroud)

但那没用.

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

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

From:  hibernate.dialect=org.hibernate.dialect.SQLServerDialect
  To:  hibernate.dialect=com.myapp.test.utils.SQLServerNativeDialect
Run Code Online (Sandbox Code Playgroud)

而这仍然无效.任何帮我引用Hibernate.STRING的帮助,这些常量都不存在.

任何有关这方面的帮助将非常感激.谢谢!

tjh*_*s66 5

这并没有太多需要解决.首先,hibernate.dialect仍然是:

hibernate.dialect=org.hibernate.dialect.SQLServerDialect
Run Code Online (Sandbox Code Playgroud)

并且".addScalar"有效,但对于Hibernate 4,我必须使用"StandardBasicTypes"类,如下所述.

    q.addScalar("currency", StandardBasicTypes.STRING);
    q.addScalar("amount", StandardBasicTypes.BIG_DECIMAL);
    q.addScalar("age", StandardBasicTypes.INTEGER);
Run Code Online (Sandbox Code Playgroud)

这是添加参数的标准:

    q.setParameter("age", age);
    q.setParameter("customerId", customerId);
Run Code Online (Sandbox Code Playgroud)

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

    q.setResultTransformer(Transformers.aliasToBean(MyDTO.class));
    List<MyDTO> results = q.list();
Run Code Online (Sandbox Code Playgroud)

我希望这有助于其他人.