[RESOLVIDO] Como resolver: Spring Data JPA não reconhece o comando SQL 'Limit'?

Estou criando uma API REST, utilizando Spring Boot, que, através de uma tabela, exibe frases aleatórias.

Dando um Google, descobri que é possível gerar resultados aleatório através de SQL puro:

SELECT <coluna> FROM <tabela> ORDER BY RANDOM() LIMIT 1;

Fiz a consulta do Banco H2, que é banco que estou usando, e funcinou:

image

O problema é que, o Spring Data não reconhece o comando SQL LIMIT. Quando crio a query dentro do repositório, através desse código:

public interface QuoteRepository extends JpaRepository<Quote, Integer> {
	
	@Query("SELECT detail FROM Quote ORDER BY RANDOM() LIMIT 1")
	Quote findByQuote();
	
	Quote findByActor(String actor);
}

Observação: a tabela scripts é mapeada pelo classe de domínio Quote.

Recebo a seguinte exceção:

unexpected token: LIMIT near line 1, column 54 [SELECT detail FROM challenge.Quote ORDER BY RANDOM() LIMIT 1]

Alguém sabe de algum comando que possa substituir LIMIT? :grin:

Desde já, muito obrigada! :blush:

Código completo no GitHub.

Ola veja aqui como executar uma SQL nativo :

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#_native_queries

tem isso tambem :

1 curtida

@Daniel_Dias, muito obrigada por responder! :grinning:

Usei o segundo link que me passou, para uso nativo e o erro parou, mas estou com outro problema…

Sempre que faço a consulta recebo, essa exceção:

org.h2.jdbc.JdbcSQLException: Column “id” not found [42122-197]

Quando uso a rota do Controller, no postman recebo essa mensagem:

{
    "timestamp": "2018-10-31T23:44:09.229+0000",
    "status": 500,
    "error": "Internal Server Error",
    "message": "could not execute query; SQL [SELECT detail FROM scripts ORDER BY RANDOM() LIMIT 1]; nested exception is org.hibernate.exception.SQLGrammarException: could not execute query",
    "path": "/v1/quote"
}

Só que o ID existe na tabela scripts, dentro de schema.sql:

CREATE TABLE scripts (
  id INTEGER PRIMARY KEY,
  /* mais código*/
);

E existe na classe Quote, que deve mapear a classe a tabela scripts:

@Entity
@Table(name="scripts")
public class Quote {

	@Id
	@Column(name="id")
	private Integer id;

        /*Outra variáveis*/      

       /*Getters e Setters*/
}

Observação: Já existe uma carga inicial em data.sql.

Agora não sei se não consegui mapear a tabela corretamente… :disappointed_relieved:

O mapeamento dessa tabela deveria ser automático, certo? :thinking: :flushed:

Enfim, vou abrir outro tópico para isso… :sweat_smile:

Ola,

eu geralmente deixo o JPA gerar tudo para mim,

em todo caso, como voce esta usando H2, fiz um pesquisa no site e olhei o seu arquivo SQL e os tipos de dados estão errado segundo o site do H2 .

Alem disso a função RANDOM() é do postgres para H2 e’RAND()

http://www.h2database.com/html/functions.html#rand

http://www.h2database.com/html/datatypes.html

1 curtida

Obrigada! Vou verificar!

Essa tabela veio de um desafio. Acho que eles aproveitaram o mesmo schema do SQLite. Existe um desafio igual, só que com banco SQLite.

Vou corrigir o SCHEMA. Muito obrigada! :blush:

1 curtida

Gente, estou acrescentando uma resposta alternativa a essa questão, pois utilizar o comando RANDOM() me gerou outros problemas. O jeito foi usar paginação, conforme sugerido no PTSO e na resposta encontrada num problema similar ao meu, também do SO: