1
resposta

Somente nome do funcionário retorna null

No meu retorno do terminal o nome do funcionário está retornando null e o resto tem o retorno normal

Segue o retorno

Pesquisa Gerada
Funcionario Id: 1 Nome: null Salario: 1000.00  CPF: 123456
Funcionario Id: 2 Nome: null Salario: 2000.00  CPF: 123
Funcionario Id: 3 Nome: null Salario: 500.00  CPF: 654321

Segue meu funcionario repository

/projecoes
    @Query(value = "SELECT f.id, f.nome_funcionario, f.salario, f.cpf FROM funcionarios f", nativeQuery = true)
    List<FuncionarioProjecao> findFuncionarioSalario();

Minha Interface de Projeção

public interface FuncionarioProjecao {

    Integer getId();
    String getNome();
    BigDecimal getSalario();
    String getCpf();


}

minha classe funcionario

package br.com.alura.spring.data.orm;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import javax.persistence.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

@Entity
@Table(name = "funcionarios")
public class Funcionario {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String nome;

    private String cpf;

    private BigDecimal salario;

    private LocalDate dataContratacao = LocalDate.now();

    @ManyToOne
    @JoinColumn(name = "cargo_id", nullable = false)
    private Cargo cargo;

    @Fetch(FetchMode.SELECT)
    @ManyToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "funcionarios_unidades", joinColumns = {
            @JoinColumn(name = "fk_funcionario")},
            inverseJoinColumns = {@JoinColumn(name = "fk_unidade")})
    private List<UnidadeTrabalho> unidadeTrabalhos;


    public Funcionario() {

    }

    public Funcionario(String nome, String cpf, BigDecimal salario, LocalDate dataContratacao) {
        this.nome = nome;
        this.cpf = cpf;
        this.salario = salario;
        this.dataContratacao = dataContratacao;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public BigDecimal getSalario() {
        return salario;
    }

    public void setSalario(BigDecimal salario) {
        this.salario = salario;
    }

    public LocalDate getDataContratacao() {
        return dataContratacao;
    }

    public void setDataContratacao(LocalDate dataContratacao) {
        this.dataContratacao = dataContratacao;
    }

    public Cargo getCargo() {
        return cargo;
    }

    public void setCargo(Cargo cargo) {
        this.cargo = cargo;
    }

    public List<UnidadeTrabalho> getUnidadeTrabalhos() {
        return unidadeTrabalhos;
    }

    public void setUnidadeTrabalhos(List<UnidadeTrabalho> unidadeTrabalhos) {
        this.unidadeTrabalhos = unidadeTrabalhos;
    }

    @Override
    public String toString() {
        return "Funcionario{" +
                "id=" + id +
                ", nome='" + nome + '\'' +
                ", cpf='" + cpf + '\'' +
                ", salario=" + salario +
                ", dataContratacao=" + dataContratacao +
                ", cargo=" + cargo +
                ", unidadeTrabalhos=" + unidadeTrabalhos +
                '}';
    }
}

A Service de Projecao

private void pesquisaFuncionarioSalario() {
        System.out.println("Pesquisa Gerada");

        List<FuncionarioProjecao> list = funcionarioRepository.findFuncionarioSalario();
        list.forEach(f -> System.out.println(
                "Funcionario Id: " + f.getId() +
                " Nome: " + f.getNome() +
                " Salario: " + f.getSalario() +
                "  CPF: " + f.getCpf()));
    }

Até coloquei o atributo CPF pra testar o tipo String mas o CPF aparece sem problemas.

1 resposta

Tenta só f.nome no lugar de f.nome_funcionario neste trecho:

@Query(value = "SELECT f.id, f.nome_funcionario, f.salario, f.cpf FROM funcionarios f", nativeQuery = true)