Objeto retornado pelo Select não exibe os atributos dos objetos que o compõe [RESOLVIDO]

Bom dia,

Tenho uma classe UnidadeFederativa como segue:

@Entity
@Table(name = "unidadesfederativas")
public class UnidadeFederativa extends Entidade {

    @Column(nullable = false)
    private String nome;
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH, optional = false)
    @JoinColumn(name = "pais", referencedColumnName = "id", nullable = false)
    private Pais pais;

e uma classe Pais que compõe a classe UnidadeFederativa, como segue:

@Entity
@Table(name = "paises")
public class Pais extends Entidade {

    @Column(nullable = false)
    private String nome;
    @OneToMany(mappedBy = "pais", fetch= FetchType.LAZY, cascade = CascadeType.REFRESH)
    private List<UnidadeFederativa> unidadesFederativas;

porém quando seleciono um objeto da classe UnidadeFederativa, não me é retornado os atributos da classe Pais, que compõe o objeto UnidadeFederativa.

Logradouro value = logradouroDao.pesqParam(“Select l From Logradouro l Where l.codigoPostal = '” + logradouro.getCodigoPostal() + “’”);

Alguém tem alguma idéia do porque este problema está ocorrendo e como é possível resolve-lo?

Desde já agradeço.

Tenta isso. No select faz o join com pais e tenta pegar no proprio select os atributos que você quer e passa em um construtor.

Bom dia,

Só uma pergunta, você está usando hibernate?

Sim, estou utilizando Hibernate com JPA.

Existe alguma forma de eu conseguir buscar um objeto da classe UnidadeFederativa e desta forma conseguir acessar também os atributos do Atributo Pais que compõe a classe UnidadeFederativa?

Obrigado

Sim tem sim, mas eu aconselho você não SQL com Hibernate a não ser que seja uma consulta bem específica e que você precise de um desempenho maior.

Você pode montar suas consultas usando Criteria e Restrictions do hibernate que é muito fácil de usar.

se você puder postar como está implementado o método “pesqParam” do logradouroDao vai facilitar.

mas seguinte, usando fetch= FetchType.LAZY, você está dizendo para o hibernate que, quando buscar um ou mais Países, é para não trazer as Unidades Federativas.

    @OneToMany(mappedBy = "pais", fetch= FetchType.LAZY, cascade = CascadeType.REFRESH)  
    private List<UnidadeFederativa> unidadesFederativas;  

e acontece o mesmo na Classe unidade federativa, ele só vai trazer o país quando solicitado. (unidadeFederativa.getPais())

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REFRESH, optional = false) 

tente mudar para fetch = FetchType.EAGER e ve se muda alguma coisa.

Abraços

Bom dia,

Obrigado FMachado.dev

Deu certo a sua dica, mudei o fetch de Lazy para EAGER e funcionou legal.

Ficou Assim na classe UnidadeFederativa:

@Entity
@Table(name = "unidadesfederativas")
public class UnidadeFederativa extends Entidade {

    @Column(nullable = false)
    private String nome;
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, optional = false)
    @JoinColumn(name = "pais", referencedColumnName = "id", nullable = false)
    private Pais pais;
    @OneToMany(mappedBy = "unidadeFederativa", fetch= FetchType.LAZY, cascade = CascadeType.ALL)
    private List&lt;Cidade&gt; cidades;

e na classe Pais ficou assim:

@Entity
@Table(name = "paises")
public class Pais extends Entidade {

    @Column(nullable = false)
    private String nome;
    @OneToMany(mappedBy = "pais", fetch= FetchType.LAZY, cascade = CascadeType.ALL)
    private List&lt;UnidadeFederativa&gt; unidadesFederativas;

O meu pesqparam é assim:

    @Override
    public T pesqParam(String query) {
        Query q = getEntityManager().createQuery(query);

        try {
            return (T) q.getSingleResult();
        } catch (NoResultException nre) {
            return null;
        }
    }

Mais uma vez, obrigado.