当我在sqldeveloper中运行时:
SELECT CASE
WHEN TABLE1.COL1 IS NOT NULL
THEN (
CASE
WHEN TABLE1.COL2 IS NOT NULL
THEN TABLE1.COL3
ELSE TABLE1.COL4
END)
WHEN TABLE1.COL5 IS NOT NULL
THEN TABLE1.COL6
ELSE TABLE1.COL7 END "C" FROM TABLE1
运行正常。 当我通过Hibernate会话运行它时,它给出了:
No Dialect mapping for JDBC type: -101
所有cols都是varchar2类型。 col1的类型为number。 数据库是oracle 10g。 如果解决方案不明显,也欢迎解决方法:) 另外,我如何找出引用的JDBC类型-101。我之前看过-1但不是-101。
编辑:我尝试在命名查询之上使用返回标量没有运气 编辑#2:有没有办法看看为“C”返回的数据类型是什么。然后我使用答案中提供的解决方案之一。
答案 0 :(得分:2)
当我们通过查询传递参数而不是直接放置值时会出现此错误。在SQL的情况下,您可以通过赋予C =:S的值并在生成的新文本框中输入值来重新生成相同的值。解决此问题的方法是升级补丁,因为这是一个错误。
答案 1 :(得分:1)
我从未在Oracle上遇到过它,但有时JDBC会在查询中返回复杂表达式的奇怪类型,而Hibernate无法解析这些类型。
在这种情况下,您可以尝试向查询添加显式强制转换:
SELECT CAST((CASE ... END) AS varchar2) "C" FROM TABLE1
答案 2 :(得分:0)
如果axtavt的答案不起作用,您可以按照以下模式定义自己的类型映射:
public class MySQL5Dialect extends org.hibernate.dialect.MySQL5Dialect
{
public MySQL5Dialect()
{
super(); // register additional hibernate types for default use in scalar sqlquery type auto detection
registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName());
}
}
当然你必须使用你获得的值而不是ov longvarchar和适当的Hiberante类型。
(我在这里编写了代码示例:http://opensource.atlassian.com/projects/hibernate/browse/HHH-1483