2
respostas

Preciso criar um método com JPQL que pegue os primeiros 50 moedas mais usadas. Porém esta dando este erro.

Na camada repository:

@Repository public interface MoedasRepository extends JpaRepository<Moedas, String> {

@Query(value = "SELECT TOP 50 * FROM moedas m ORDER BY m.rank WHERE m.rank < :rank",
        nativeQuery = true)
List<Moedas> findMoedasByFavoritas(Long rank);

}

Camada controller:

@GetMapping("rankMoedas") public List getALlTopMoedas(@RequestParam(value = "rank", required = false) Long rank) { return moedasRepository.findMoedasByFavoritas(rank); }

O erro que esta dando é este:

could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet
2 respostas

Fiz algumas alterações:

@Repository public interface MoedasRepository extends JpaRepository<Moedas, Long> {

@Query(value = "SELECT * FROM moedas m  WHERE m.rank < :rank  ORDER BY m.rank ASC Limit 50",
        nativeQuery = true)
List<Moedas> findTopRankMoedas(Long rank);

}

Mas mesmo assim me retorna isso:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá, Guilherme!

Pelo erro apresentado, parece que há um problema na sua consulta JPQL. O erro "could not extract ResultSet" geralmente indica um erro de sintaxe na consulta SQL gerada pelo Hibernate.

No seu caso, parece que você está tentando usar a cláusula "TOP" na sua consulta, que é uma sintaxe específica do SQL Server. No entanto, a JPQL não suporta essa sintaxe.

Uma alternativa para obter os primeiros 50 registros seria utilizar a função "LIMIT" do MySQL ou "FETCH FIRST" do Oracle. Por exemplo:

@Query("SELECT m FROM Moedas m WHERE m.rank < :rank ORDER BY m.rank")
List<Moedas> findMoedasByFavoritas(@Param("rank") Long rank, Pageable pageable);

E no seu método do controller, você pode usar o objeto PageRequest para definir o limite de resultados:

@GetMapping("rankMoedas")
public List<Moedas> getALlTopMoedas(@RequestParam(value = "rank", required = false) Long rank) {
    Pageable pageable = PageRequest.of(0, 50); // Define o limite de 50 registros
    return moedasRepository.findMoedasByFavoritas(rank, pageable).getContent();
}

Dessa forma, você estará limitando a consulta aos primeiros 50 registros de acordo com a classificação "rank".

Espero ter ajudado e bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software