此刻,我们的项目使用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”。但是创建这些过程的人并不想对其进行更新,而是要求我们为其找到解决方案。
那么在这种情况下,谁能告诉我该怎么办?
答案 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日期