Dúvida com Hibernate e mySQL

5 respostas
knik

Amigos,

Por que o código abaixo funciona?
public List<Filme> listarFilmes(){

		Session sessao = HibernateUtility.getSession();
		Transaction tx = sessao.beginTransaction();
		Query select = sessao.createQuery("from Filme where id_genero=:id_genero");
		select.setInteger("id_genero", 1);			
		List<Filme> lista = (ArrayList<Filme>) select.list();
	
		tx.commit();
		sessao.close();
		
		return lista;
	
	}
...e o código abaixo NÃO FUNCIONA?
public List<Filme> listarFilmes(){

		Session sessao = HibernateUtility.getSession();
		Transaction tx = sessao.beginTransaction();
		Query select = sessao.createQuery("from Filme limit :limitInicial , :limitFinal");
		select.setInteger("limitInicial", 1);
		select.setInteger("limitFinal", 5);
		List<Filme> lista = (ArrayList<Filme>) select.list();
	
		tx.commit();
		sessao.close();
		
		return lista;
	
	}
...sendo que a instrução SQL abaixo funciona perfeitamente no terminal do mySQL:
select * from Filme limit 1, 2;

Existe uma outra maneira de limitar a consulta com hibernate, ou será que o hibernate não suporta isto?
Obrigado a todos.

5 Respostas

douglasfs

O segundo trecho não funciona porque você está usando um recurso especifico do MySQL (limit) não suportado por HQL.

Lembre-se que HQL é uma linguagem de consulta de alto nivel independente de banco.

Procure por “native sql” na documentação do Hibernate para utilizar recursos especificos do seu B.D.

[]s e boa sorte,

Douglas

knik

Positivo!!!
Foi só procurar mais um pouquinho e… você tinha razão. Veja o que fiz:

Query select = sessao.createQuery("from Filme"); select.setMaxResults(2); select.setFirstResult(1);
Este código apresenta apenas dois registros ( setMaxResults(2) ) e ele inicia no 1º registro ( setFirstResult(1) ).
Valeu pela dica!

plentz

Dica: o controle transacional não deve ficar dentro do DAO.

Ferryman

Acredito que isso depende da necessiadade Plentz,

Se na minha aplicação não preciso utilizar transações que não sejam no mesmo DAO então não há necessidade de criar um objeto para gerenciar transações né? Então a transação poderia ficar dentro do DAO.

[]
Ferry

plentz

Ferryman:
Acredito que isso depende da necessiadade Plentz,

Se na minha aplicação não preciso utilizar transações que não sejam no mesmo DAO então não há necessidade de criar um objeto para gerenciar transações né? Então a transação poderia ficar dentro do DAO.

[]
Ferry

Mesmo no seu exemplo não é uma boa prática. Caso você queira usar o mesmo método em outra operação que precise de transação, você simplesmente não vai poder fazer isso sem criar um método novo ou alterar o existente.

Criado 7 de março de 2007
Ultima resposta 9 de mar. de 2007
Respostas 5
Participantes 4