查询在sql developer中运行正常,但在hibernate中崩溃了

时间:2011-03-04 15:51:49

标签: sql hibernate oracle10g

当我在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”返回的数据类型是什么。然后我使用答案中提供的解决方案之一。

3 个答案:

答案 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