我正在使用最新的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();
仅供参考:MY_VIEW_RECEIVABLES是一个视图,“account_name”字段是一个NVARCHAR(120)
我得到的问题是:
org.springframework.orm.hibernate4.HibernateSystemException:没有JDBC类型的Dialect映射:-9;嵌套异常是org.hibernate.MappingException:没有JDBC类型的Dialect映射:-9
在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的帮助,这些常量都不存在。
对此的任何帮助将不胜感激。谢谢!
答案 0 :(得分:5)
这不需要太多修复。首先,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();
我希望这可以帮助其他人。