java - JPA 2.0 - native 查询中的 NVARCHAR

标签 java hibernate sql-server-2008-r2 jpa-2.0 nvarchar

我正在处理的项目具有以下设置:JPA 2.0(Hibernate 4 实现)和 SQL Server 2008 R2。

我需要从 SQL View 中选择一些数据。为了做到这一点,我使用了 native 查询,但我遇到了 NVARCHAR 字段的一些问题。基本上,在使用这段代码时:

 String sql = "SELECT v.text_field as address FROM SOME_CUSTOM_VIEW v
 Query q = entityManager.createNativeQuery(sql,"ItemDetailsMapping");
 List<Object[]> result = q.getResultList();

ItemDetailsMapping 声明如下:

@SqlResultSetMapping(name = "ItemDetailsMapping", columns = { @ColumnResult(name = "address") })

我得到一个异常(exception)说:

org.springframework.orm.hibernate3.HibernateSystemException: No Dialect mapping for JDBC     type: -9; nested exception is org.hibernate.MappingException: No Dialect mapping for JDBC type: -9

类型 -9 实际上是 NVARCHAR 类型,我们在整个应用程序中广泛使用它,当我们使用非 native 查询时它可以完美地工作。为什么它不适用于 native 查询?我什至使用了自定义方言并注册了类型,但它仍然无法正常工作。

非常感谢您的帮助

最佳答案

您必须将数据类型 NVARCHAR 关联到 String。当通过 Session 接口(interface)使用 Hibernate 时,您可以使用 addScalar() 显式设置结果类型 而不是(也可以通过 JPA 2.0 中的 unwrap() 访问):

所以修改你的代码如下,

 String sql = "SELECT v.text_field as address FROM SOME_CUSTOM_VIEW v"
 Query q = entityManager.createNativeQuery(sql,"ItemDetailsMapping");
 q.unwrap(SQLQuery.class).addScalar("address ", StringType.INSTANCE);
 List<Object[]> result = q.getResultList();

阅读here获取更多信息。

(编辑 2015 年 7 月 1 日——为清楚起见添加了引号)

关于java - JPA 2.0 - native 查询中的 NVARCHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9736574/

相关文章:

java - mysql 中的 float 和 double 数据类型不存储我的 java 程序所需的完整数字

java - Tapestry XML 输出

java - Android 隐藏来自 Firebase 的通知

java - Java中的几个默认包

spring-boot - "JdbcSQLIntegrityConstraintViolationException: Unique index or primary key violation"升级到Spring Boot 2.7后出现异常

java - 在 Hibernate 中获取 JDBC 结果集

sql-server - 如何使用 CMD 将 SQL Server 实例 TCP 端口更改为 1433?

hibernate - 当发生未处理的异常时,Hibernate 是否会自动回滚编程事务?

asp.net - 如何将下拉列表添加为 gridview 项目

tsql - 将日期范围转换为每天记录的 SQL 查询