JPA调用存储过程,无法在ref_cursor中转换时间戳

时间:2018-06-27 11:27:41

标签: java jpa stored-procedures

此刻,我们的项目使用JPA调用这样的存储过程:

  StoredProcedureQuery query = em.createStoredProcedureQuery("Package.Procedure")
            .registerStoredProcedureParameter(1, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(2, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(3, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(4, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(5, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(6, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(7, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(8, String.class, ParameterMode.IN)
            .registerStoredProcedureParameter(9, Long.class, ParameterMode.IN)
            .registerStoredProcedureParameter(10, Class.class, ParameterMode.REF_CURSOR)
            .setParameter(1, null)
            .setParameter(2, null)
            .setParameter(3, null)
            .setParameter(4, null)
            .setParameter(5, null)
            .setParameter(6, null)
            .setParameter(7, null)
            .setParameter(8, null)
            .setParameter(9, null);
    List<Object[]> result = query.getResultList();

输出是一个具有2个timestamp列的表。

当我尝试运行此代码时,我们遇到了异常:

  

由以下原因引起:org.hibernate.MappingException:没有JDBC类型的方言映射:-101

在我四处搜寻时,-101表示结果包含时间戳,但我认为无法将其转换。我们尝试从过程中删除那两个timestamps列,一切正常。

我尝试搜索解决方案,大多数答案都告诉我在返回值之前将值强制转换为“ addScalar”。但是创建这些过程的人并不想对其进行更新,而是要求我们为其找到解决方案。

那么在这种情况下,谁能告诉我该怎么办?

2 个答案:

答案 0 :(得分:1)

经过更多研究,我发现了这个page

我必须创建自己的自定义Oracle方言并为其注册类型-101。

public class MyOracleDialect extends Oracle10gDialect {

    public MyOracleDialect() {
        super();
        registerHibernateType(-101, DateType.INSTANCE.getName());
    }
}

由于在Types类中未找到-101类型,因此我必须在此处使用修订号。

然后,我将“ hibernate.dialect”配置更改为此类。

现在一切正常。

答案 1 :(得分:0)

如果我正确理解您的意见,那么您在转换时间戳时会出错。 所有Java日期(例如java.util.Date或java.sql.Date)都可以使用长整数 然后您可以从时间戳中获取此较长的数字并将其转换为Java日期