我正在使用最新的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类型的方言映射:-9; 嵌套的异常是org.hibernate.MappingException:否JDBC类型的方言映射: org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:185)-9
org.springframework.orm.hibernate4.HibernateSystemException:否JDBC类型的方言映射:-9; 嵌套的异常是org.hibernate.MappingException:否JDBC类型的方言映射:
org.springframework.orm.hibernate4.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:185)-9
在搜索过程中,我明白了,方言无法确定数据类型,因此我必须添加Scalar映射…但是我尝试通过添加以下内容来实现:
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();
我希望这可以帮助其他人。