Erro ResultSet na chamada de StoredProcedure com SpringBoot Data

7 respostas Resolvido
restspring-bootspringprocedurejpa
G

Estou tentando trazer uma lista de dados do banco através de uma procedure mas está dando erro de resultSet e não faço ideia do porque

A procedure está certo, quando chamo no banco os dados vem certos, são tres colunas, que são: qtd, nome e valor

atuacao_id é a chave usada pra fazer um join na procedure

java.sql.SQLException: Column 'atuacao_id' not found.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql- 
     connector-java-8.0.27.jar:8.0.27]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql- 
     connector-java-8.0.27.jar:8.0.27]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql- 
    connector-java-8.0.27.jar:8.0.27]
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql- 
    connector-java-8.0.27.jar:8.0.27]
at com.mysql.cj.jdbc.result.ResultSetImpl.findColumn(ResultSetImpl.java:581) ~[mysql-connector- 
     java-8.0.27.jar:8.0.27]
at com.mysql.cj.jdbc.result.ResultSetImpl.getLong(ResultSetImpl.java:854) ~[mysql-connector- 
     java-8.0.27.jar:8.0.27]
at com.zaxxer.hikari.pool.HikariProxyResultSet.getLong(HikariProxyResultSet.java) ~[HikariCP- 
    4.0.3.jar:na]

o endPoint

@GetMapping("/gastoPorAtuacao")
    public List<AtuacaoCustomDto> gastoPorAtuacao() {
	    List<AtuacaoCustom> s = atuacaoCustomRepository.gastoPorAtuacao();
	    return AtuacaoCustomDto.converter(s);
    }

Repositorio (extends JpaRepository)

@Query(value = "call gastos_por_atuacao; ", nativeQuery = true)
    List<AtuacaoCustom> gastoPorAtuacao();

o Dto

public class AtuacaoCustomDto {

    private long qtd;
    private String nome;
    private BigDecimal valor;

    // getters and setters 

    public AtuacaoCustomDto() {	}

    public AtuacaoCustomDto(AtuacaoCustom a) {
	  this.qtd = a.getQtd();
	  this.nome = a.getNome();
	  this.valor = a.getValor();
    }
    public AtuacaoCustomDto(long qtd, String nome, BigDecimal valor) {
 	  this.qtd = qtd;
	  this.nome = nome;
	  this.valor = valor;
    }
    public static List<AtuacaoCustomDto> converter(List<AtuacaoCustom> s) {
     	return s.stream().map(AtuacaoCustomDto::new).collect(Collectors.toList());
    }

   }

7 Respostas

P

Como é a class AtuacaoCustom?

G
@Entity
@Table(name = "tbl_atuacao")
public class AtuacaoCustom {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // auto-increment
@Column(name = "atuacao_id")
private long id;

@Column(name = "nome_atuacao")
@NotNull
@NotEmpty(message = "Atuacao não pode ser vazio")
@Size(min = 2, max = 100, message = "Atuacao não pode ultrapassar 100 caracteres")
private String nome;

@Column(name = "descricao_atuacao")
@NotNull
@NotEmpty(message = "Atuacao não pode ser vazio")
@Size(max = 100, message = "Atuacao não pode ultrapassar 150 caracteres")
private String descricao;

@Column(name = "data_criacao")
private LocalDateTime dataCriacao = LocalDateTime.now();

@Column(name = "data_ultima_alteracao")
private LocalDateTime dataUltimaAlteracao = LocalDateTime.now();

private BigDecimal valor;
private long qtd;

   //getters and setters

public AtuacaoCustom(long qtd, String nome, BigDecimal valor) {
	this.qtd = qtd;
	this.nome = nome;
	this.valor = valor;
}

}
G

É uma classe com getters and setters

P

E tem uma coluna mapeada “atuacao_id” que não é retornada no teu procedure

G

essa classe leva um @Entity que exige um @Id não posso tirar ele é minha classe de entidade
por isso chamo um DTO onde tem os dados que realmente retornam da procedure

ate tentei fazer o endpoint assim:

@GetMapping("/gastoPorAtuacao")
    public List<AtuacaoCustomDto> gastoPorAtuacao() {
	     return AtuacaoCustomDto.converter(atuacaoCustomRepository.gastoPorAtuacao());
    }

mas deu o mesmo erro

G

Mesmo tirando tudo ainda preciso do @Entity e do @Id consequentemente, da outro erro se tiro

@Entity
public class AtuacaoCustom {

@Id
private long id;
private String nome;
private String descricao;
private LocalDateTime dataCriacao = LocalDateTime.now();
private LocalDateTime dataUltimaAlteracao = LocalDateTime.now();
private BigDecimal valor;
private long qtd;

//getters and setters

public AtuacaoCustom(long qtd, String nome, BigDecimal valor) {
     this.qtd = qtd;
     this.nome = nome;
     this.valor = valor;
}

}
P
Solucao aceita

O problema aqui é que não podes usar essa entidade para o retorno do procedure uma vez que essa entidade tem mais colunas mapeadas do que as retornadas pelo teu procedure.
Tens de criar uma entidade específica para isso.

Criado 20 de novembro de 2021
Ultima resposta 22 de nov. de 2021
Respostas 7
Participantes 2