Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

method create in repository

nesse trecho abaixo: / "[05:32] Vamos abrir nossa entidade tópico, e realmente, o título existe, mas nomeCurso não. No caso, curso é um relacionamento. Temos um tópico, ele está relacionado com curso. Dentro de curso é que tem o atributo nome. Como eu faço para filtrar não por um atributo da entidade, mas por um atributo que é de um relacionamento que está na minha entidade? Não tem problema, o Spring também consegue filtrar isso. Só precisamos mudar o padrão para findbyCursoNome. Curso é a entidade de relacionamento, Nome é o atributo dentro dessa entidade de relacionamento. Dessa maneira, ele vai conseguir encontrar."

e se eu quisesse buscar pelo ID da entidade curso? seria "findByCursoId"? eu tentei dessa forma que exemplifiquei ai e deu erro... Como faria?

Atenciosamente

7 respostas

Oi Vinicius,

Isso mesmo, deveria funcionar com findByCursoId.

Qual foi erro que ocorreu? Poste aqui também o código da sua classe Curso.

é que na verdade eu não estou fazendo o seu código, estou fazendo um de um projetinho meu em particular e utilizando o video do curso para algumas duvidas. Vou postar os meus códigos e o erro. Segue o erro:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'unidadeBusiness': Unsatisfied dependency expressed through field 'unidadeRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'unidadeRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract com.pilari9.rest.pilar.entity.Unidade com.pilari9.rest.pilar.repository.UnidadeRepository.findByProjetoId(java.lang.Long)! Unable to locate Attribute with the the given name [id] on this ManagedType [com.pilari9.rest.pilar.entity.Projeto]

Segue o código:

package com.pilari9.rest.pilar.repository;

import com.pilari9.rest.pilar.entity.Unidade;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.Optional;

public interface UnidadeRepository extends JpaRepository<Unidade, Long> {

    Optional<Unidade> findByProjetoId(Long idProjeto);
}
-------------------------------------------------
package com.pilari9.rest.pilar.entity;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "unidade")
public class Unidade implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    private String descricao;
    @ManyToOne
    private Projeto projeto;

    public Unidade() {
    }

    public Unidade(String descricao, Projeto projeto) {
        this.descricao = descricao;
        this.projeto = projeto;
    }

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Projeto getProjeto() {
        return projeto;
    }

    public void setProjeto(Projeto projeto) {
        this.projeto = projeto;
    }
}

------------------------------------------------
package com.pilari9.rest.pilar.entity;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "projeto")
public class Projeto implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long Id;
    private String descricao;
    @ManyToOne
    private Empresa empresa;

    public Projeto() {
    }

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Empresa getEmpresa() {
        return empresa;
    }

    public void setEmpresa(Empresa empresa) {
        this.empresa = empresa;
    }
}

-----------------------------------------------
package com.pilari9.rest.pilar.business;

import com.pilari9.rest.pilar.DTO.requestDTO.UnidadeRequestDTO;
import com.pilari9.rest.pilar.DTO.responseDTO.UnidadeResponseDTO;
import com.pilari9.rest.pilar.entity.Projeto;
import com.pilari9.rest.pilar.entity.Unidade;
import com.pilari9.rest.pilar.repository.ProjetoRepository;
import com.pilari9.rest.pilar.repository.UnidadeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Optional;

@Component
public class UnidadeBusiness {

    @Autowired
    private UnidadeRepository unidadeRepository;

    @Autowired
    private ProjetoRepository projetoRepository;

    public UnidadeResponseDTO findByProjetoId(Long idProjeto) throws Exception {
        Optional<Unidade> optionalUnidade = unidadeRepository.findByProjetoId(idProjeto);

        if (!optionalUnidade.isPresent()) {
            throw new Exception("Nao encontrado projeto atraves do ID: " + idProjeto);
        }

        Unidade unidade = optionalUnidade.get();
        return new UnidadeResponseDTO(unidade.getId(), unidade.getDescricao(), idProjeto);
    }

    public UnidadeResponseDTO cadastra(UnidadeRequestDTO unidadeRequestDTO) throws Exception {
        Optional<Projeto> optionalProjeto = projetoRepository.findById(unidadeRequestDTO.getIdProjeto());
        if (!optionalProjeto.isPresent()){
            throw new Exception("Nao encontrado projeto atraves do ID: " + unidadeRequestDTO.getIdProjeto());
        }

        Projeto projeto = optionalProjeto.get();
        Unidade unidade = new Unidade(unidadeRequestDTO.getDescricao(), projeto);
        unidadeRepository.save(unidade);

        return new UnidadeResponseDTO(unidade.getId(), unidade.getDescricao(), projeto.getId());
    }
}

minha API ta estruturada com as camadas controller -> service -> business -> repository. E no caso do seu forms o meu é "UnidadeRequestDTO" e o meu DTO de retorno é o "UnidadeResponseDTO". E mais a entity.

Tentei fazer sem o "Optional" e também deu o mesmo erro.

solução!

O problema é que na sua classe Projeto o atributo id está com a letra I em maiúsculo:

@Entity
@Table(name = "projeto")
public class Projeto implements Serializable {

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

Altere para:

@Entity
@Table(name = "projeto")
public class Projeto implements Serializable {

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

Opá, deu certo!! Muito obrigado.

Obs: Muito bom o curso, me ajudou em vários detalhes.