@Marcelo_Nascimento1 escreveu:
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.
Mensagens: 5
Participantes: 2