【问题标题】:Hibernate native sql queryHibernate 原生 sql 查询
【发布时间】:2014-07-15 06:32:12
【问题描述】:

完美的ms-sql语句

SELECT distinct ProductLineCode ,
(SELECT CAST(ItemName + ', ' AS VARCHAR(MAX)) FROM Product spt 
where spt.ProductLineCode = pt.ProductLineCode FOR XML PATH ('')) 
as ItemNames FROM Product pt where ProductLineCode is not null

在休眠中作为本机查询执行时会导致错误。

org.hibernate.MappingException:没有 JDBC 类型的方言映射:-16

我猜想 JDBC type: -16 是布尔值,但这并没有说明什么。产品表具有 xml 映射,并且可以运行数月。 能否请您指导我接下来要尝试什么?

【问题讨论】:

  • Lokks 无法为某些 DB 类型添加正确的 Java 类型。 (可能是 VARCHAR(MAX))。尝试使用查询列的结果类型
  • 删除 AS VARCHAR(MAX) 导致 org.hibernate.util.JDBCExceptionReporter -17190 [main] - SQL 错误:org.hibernate.util.JDBCExceptionReporter -17191 [main] - 'CAST' 附近的语法不正确,应为“AS”。
  • 尝试其他类型。例如VARCHAR(100)

标签: sql hibernate native


【解决方案1】:

您可能会按照 cmets 中的建议通过更改 sql 中的类型来获得类似的工作。

但是,如果这没有带来成功,您也可以通过更改应用程序使用的 Dialect 类来告诉 hibernate 如何处理这种类型,甚至可能扩展当前使用的类并添加注册缺少的类型。

您缺少的类型映射似乎是针对 java.sql.Types.LONGNVARCHAR 类型(通过代码 grep,值为 -16),因此带有类似调用的 Dialect 扩展名

registerColumnType( Types.LONGNVARCHAR, "text" );

在构造函数中可能会说服hibernate将此字段视为文本。

如果您这样做,您必须通过修改行来更改配置以使用您的方言

<property name="dialect">org.hibernate.dialect.SQLServer2012Dialect</property>

使用您自己的方言类。 (注意:那里的课程只是您现在可能拥有的猜测。)

也有可能您只是休眠时使用了错误的 DB 方言,在这种情况下,只需将配置更改为适当的配置会更好。

很少需要使用自定义Dialect,但这可能是其中之一。

【讨论】:

  • 我找不到任何替代 ms SQL 服务器方言的方法 org.hibernate.dialect.SQLServerDialect
  • 谢谢唐。我可以在哪里注册 Column 类型?
  • 哪些方言可用取决于你的hibernate版本,哪一种合适当然取决于你的数据库版本。
  • 只需将registerColumnType 调用添加到对话框扩展的构造函数中。
  • 我刚刚注意到这个related question 也可能有用。
猜你喜欢
  • 1970-01-01
  • 2016-10-11
  • 2011-08-28
  • 2021-10-12
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 2012-07-15
  • 2015-07-15
相关资源
最近更新 更多