Bom dia a todos!
Estou integrando um sistema java/hibernate com uma pl sql/procedure.
Sempre que tento compilar retorna esse erro: java.lang.Integer cannot be cast to java.lang.Double. O erro é bem claro, que um inteiro não pode ser passado pro double. O problema é que momento algum eu uso inteiro nessa aplicação.
Segue o código da entidade:
@Entity
@Table(name="TCONTAS")
@NamedQuery(name="Tconta.findAll", query="SELECT t FROM Tconta t")
@NamedStoredProcedureQuery(
name="PRC_CREATE_CONTAS",
procedureName="PRC_CREATE_CONTAS",
resultClasses = { Tconta.class },
parameters={
@StoredProcedureParameter(name="valor", type=Double.class, mode=ParameterMode.IN),
@StoredProcedureParameter(name="juros", type=Double.class, mode=ParameterMode.IN),
@StoredProcedureParameter(name="vancimento", type=Date.class, mode=ParameterMode.IN)
}
)
public class Tconta implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@SequenceGenerator(name="TCONTAS_CODIGO_GENERATOR", sequenceName="SEQ_TCONTAS")
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TCONTAS_CODIGO_GENERATOR")
private long codigo;
private Double juros;
private Double valor;
@Temporal(TemporalType.DATE)
private Date vancimento;
public Tconta() {
}
public long getCodigo() {
return this.codigo;
}
public void setCodigo(long codigo) {
this.codigo = codigo;
}
public Double getJuros() {
return this.juros;
}
public void setJuros(Double juros) {
this.juros = juros;
}
//pra nao ocupar mt espaço eu tirei os get e set do valor e vAncimento rs
Método principal
public void save()
{
//em está em um método construtor
em.getTransaction().begin();
//em.persist(_contas);
StoredProcedureQuery prc = em.createNamedStoredProcedureQuery("PRC_CREATE_CONTAS");
prc.registerStoredProcedureParameter("valor", Double.class, ParameterMode.IN);
prc.registerStoredProcedureParameter("juros", Double.class, ParameterMode.IN);
prc.registerStoredProcedureParameter("vancimento", Date.class, ParameterMode.IN);
prc.setParameter("valor", 900);
prc.setParameter("juros", 9.2);
prc.setParameter("vancimento", data);
prc.execute();
em.getTransaction().commit();
em.close();
}
Procedure:
CREATE OR REPLACE PROCEDURE PRC_CREATE_CONTAS(vVALOR IN NUMBER, vJUROS IN NUMBER, vVANCIMENTO IN DATE) IS
BEGIN
--regras
END;
se eu mudar tudo de Double pra int, retorna o seguinte erro:
ERROR: Tentativa de definir um nome de parâmetro que não ocorre no código SQL: valor
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException:
Error preparing CallableStatement
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:149)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:157)
at org.hibernate.procedure.internal.ProcedureCallImpl.execute(ProcedureCallImpl.java:653)
at bean.Contas_bean.save(Contas_bean.java:40)
at bean.Main.main(Main.java:8)
Caused by: org.hibernate.exception.GenericJDBCException: Error preparing CallableStatement
at
org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:456)
at org.hibernate.procedure.internal.ProcedureCallImpl.getOutputs(ProcedureCallImpl.java:404)
at org.hibernate.procedure.internal.ProcedureCallImpl.outputs(ProcedureCallImpl.java:663)
at org.hibernate.procedure.internal.ProcedureCallImpl.execute(ProcedureCallImpl.java:646)
... 2 more
Caused by: java.sql.SQLException: Tentativa de definir um nome de parâmetro que não ocorre no código SQL: valor
at oracle.jdbc.driver.OracleCallableStatement.addNamedPara(OracleCallableStatement.java:6153)
at oracle.jdbc.driver.OracleCallableStatement.setInt(OracleCallableStatement.java:5561)
at oracle.jdbc.driver.OracleCallableStatementWrapper.setInt(OracleCallableStatementWrapper.java:166)
at org.hibernate.type.descriptor.sql.IntegerTypeDescriptor$1.doBind(IntegerTypeDescriptor.java:52)
at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:104)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:400)
at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:395)
at org.hibernate.procedure.internal.AbstractParameterRegistrationImpl.prepare(AbstractParameterRegistrationImpl.java:335)
at org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs(ProcedureCallImpl.java:444)
... 5 more
Hibernate:
{call PRC_CREATE_CONTAS(?,?,?,?,?,?)}
OBS: O sistema persiste perfeitamente sem procedure, apenas com entityManager.