GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Como fazer um SELECT * com JPA Named Query (usando repository)?

Tags: #<Tag:0x00007fcfca3237e0>

Como fazer, utilizando interfaces (padrão repository), um select *? JPA e Hibernate.

Em exemplo:

public interface LoginRepository extends <LoginEntity, String>{

void save(LoginEntity entity);

//Nesse método, usando a assinatura dele, quero retornar uma lista com as entity.
List<LoginEntity> findAllBy();

}

Falaa @FearX

Você pode fazer uma operação de banco apenas pela forma que o nome do método é feito, exemplo:

//Pega os 5 primeiros registros ordenados por id decrescente
public List<Pesquisa> findTop5ByOrderByIdDesc();

//Pega o ultimo registro ordenado por id decrescente
public Pesquisa findTopByCpfOrderByIdDesc(String cpf);

Outro jeito é definir a anotação query em cima do método.
Ex:

@Query(value = "SELECT * FROM relatorio WHERE id IN ( SELECT MAX(id) FROM relatorio GROUP BY sistema_id) order by sistema_id", nativeQuery = true)
	List<Relatorio> getLastRelatorioGroupBySistema();

EDIT:
Da uma olhada nesse material, principalmente do meio da página pro final.
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#reference

Meu caro Mike, tá dificil aprender esse troço, hein! rs

Estou tentando fazer essa query aqui:

@Query(value = "SELECT p.id, p.name, p.age, p.city, p.info, p.state, p.status, p.picture\n" +
        "FROM owner_pet as op\n" +
        "INNER JOIN lost_pet as p on op.id_pet =?1\n" +
       "WHERE op.id_owner =?1", nativeQuery = true)
List<LostPetEntity> find(Integer id);

Mas a exception diz:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.Object[]] to type [fearx.projects.animal.finder.api.entity.LostPetEntity] for value ‘{1, Dogola, 1, Nova União, /r/ban, RO, NOTICED, defaultvalue}’; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [fearx.projects.animal.finder.api.entity.LostPetEntity]] with root cause

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.Integer] to type [fearx.projects.animal.finder.api.entity.LostPetEntity]

Pelo que entendi, ele não tá conseguindo converter o que vem para uma LostPetEntity. Todavia, é exatamente essa entidade que me é retornada pela query.

O que posso fazer? Eu consigo retornar se for um Object, mas isso num me ajuda muito

Você não esta conseguindo pq essa consulta retorna um array de object.

Como você esta escolhendo os campos que quer retornar, você pode criar um construtor com esses atributos e chamar esse construtor no select

Ex:

SELECT NEW OwnerPet(p.id, p.name) from OwnerPet Where ...

Não me recordo se NEW Construtor funciona com nativeQuery, tem que testar ai.

Pro código acima funcionar, a classe OwnerPet tem que ter um construtor que recebe id e nome como parâmetro.
Então como voce ta pegando 8 atributos, voce tem que ter um construtor que tenha 8 parametros

Então, a entity que ta vindo é a LostPetEntity. OwnerPetEntity é minha tabela de relacionamento.

A entity que estou tentando retornar é essa:

import lombok.Data;

import javax.persistence.*;

@Entity(name = "lost_pet")
@Data
public class LostPetEntity {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column
    private String picture;
    @Column
    private String name;
    @Column
    private String age;
    @Column
    private String info;
    @Column
    private String city;
    @Column
    private String state;
    @Column
    private String status;

    public LostPetEntity(PetDTO dto) {
        this.picture = dto.getPicture();
        this.name = dto.getName();
        this.age = dto.getAge();
        this.info = dto.getInfo();
        this.city = dto.getCity();
        this.state = dto.getState();
        this.status = String.valueOf(Status.MISSING);
    }

    public LostPetEntity() {
    }
}

Por isso que não to entendendo nada… Existe esse construtor!

Se você esta recebendo como parâmetro uma classe sua, acredito que você vai ter que fazer um new construtor aninhado

"SELECT NEW LostPetEntity(NEW Pet(p.atributos)) FROM ..."

Caso isso não de certo, passa os atributos (ao invés de um objeto pet) de Pet pelo construtor

Ah, os males de não entender HQL… Vou tentar dessa forma

@Query("SELECT obj FROM LoginEntity obj")
List<LoginEntity> findAll();

A propria JPA Repository tem esse método, não é necessário cria-lo

//