2017-04-12 69 views
1

我有一个使用JPA的自定义实现来调用存储过程的弹簧启动应用程序。问题是,当执行调用时,我得到“在index :: 7处缺少IN或OUT参数”。“SQLException:缺少IN或OUT参数”尽管已明确注册

实施看起来是这样的:

public class DbLogImpl implements DbLogCustom { 
    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public Long callInsertLog(Long firstId, Long secondId, Long process, Long subProcess, Long logLevelId, String message, String stacktrace) { 

     Long logId = null; 

     StoredProcedureQuery proc = em.createStoredProcedureQuery("logging_pk.insert_log"); 
     proc.registerStoredProcedureParameter(0, Long.class, IN); 
     proc.registerStoredProcedureParameter(1, Long.class, IN); 
     proc.registerStoredProcedureParameter(2, Long.class, IN); 
     proc.registerStoredProcedureParameter(3, Long.class, IN); 
     proc.registerStoredProcedureParameter(4, Long.class, IN); 
     proc.registerStoredProcedureParameter(5, String.class, IN); 
     proc.registerStoredProcedureParameter(6, String.class, IN); 
     proc.setParameter(0, firstId); 
     proc.setParameter(1, secondId); 
     proc.setParameter(2, process); 
     proc.setParameter(3, subProcess); 
     proc.setParameter(4, logLevelId); 
     proc.setParameter(5, message); 
     proc.setParameter(6, stacktrace); 
     proc.registerStoredProcedureParameter(7, Long.class, OUT); 
     proc.execute(); 

     logId = (Long) proc.getOutputParameterValue(7); 

     return logId; 
    } 
} 

我的包是这样的:

​​

如果这是我唯一的过程我很可能会具有不服输,想另一种方法。我设法使用本机查询,但实际上并没有获得输出参数值。)

但是,我有另一个存储过程调用,其设置完全像这个,并且工作正常。唯一的区别是参数的名称和数量(工作人员有3个输入和1个输出,最后也是输出)。

我不明白为什么一个工作正常,而另一个没有。

编辑: 因为我发现张贴了这个问题之前的问题,我决定省略了很多的代码是无关的问题,但我会在这里把这个留给他人找到。

回答

1

在写这个问题时,我突然有一个想法。

原来,解决方案相当简单。

显然,将字符串参数设置为null不被接受。通过引入空检查并设置空字符串(本例中为stacktrace参数)来清空字符串,而不是解决问题。

如果有人遇到此问题,请将此处留下。

相关问题