FindByExample com JPA

6 respostas
Ferryman

Eai Pessoal,

Estou começando a brincar com JPA e preciso de ajuda. Alguem sabe como eu implemento um findByExample genérico com JPA?

Preciso que este método recebe uma instancia somente com alguns campos preenchidos, e recupere do banco todas as intancias com os valores iguais ao objeto de exemplo. Existe alguma maneira de fazer essa comparação?

estou seguindo nesta linha:

public List<K> findByExample(K example) {
		String tableName = example.getClass().getSimpleName();
		String objectName = example.getClass().getSimpleName().toLowerCase();
 		Query query = em.createQuery("SELECT " + objectName + " FROM " + tableName + " " + 
				 objectName + " WHERE " + objectName + " = :example");
		query.setParameter("example", example);
				
		return query.getResultList();
	}

Estou recebendo uma a seguinte exceção:

Exception in thread “main” java.lang.IllegalStateException: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: br.com.educare.api.Especial

Acho que isso não está funcionando pois a query ira procurar uma instancia exatamente igual a que eu passei. Como eu posso driblar isso para que ele compare só com os campos que eu preenchi? Implemento isso no .equals() do objeto que será comparado?

Valeu pessoal

[]s
Ferry

6 Respostas

urubatan

se tu quer fazer consultas dinâmicas use Criteria e não concatenação de strings para montar um hql

mchiareli

que não se encontra na espec da jpa…

Ferryman

Pois é…

Gostaria mesmo de usar critéria, estou até pensando em voltar pra hibernate e esperar implementarem criteria em jpa.

Mas usando jpa, tem como fazer o que eu preciso?

Valeu
[]s

Ferryman

Pessoal,

Acabei de ler a spec e lá diz que quando eu comparo objetos eles só são iguais se a primaryKey for a mesma... então acredito que implementar um equals no objeto que só compara os valores preenchidos nao vai adiantar.
Assim não sei se da pra implementar um findByExample genérico com jpa.

Como estou usando a implementação do Hibernate vou apelar. Eu sei as desvantagens de fazer isso, mas até sair a implementação da spec de JPA que tem Criteria vou ser obrigado a usar a Session do hibernate neste método.

Só pra deixar aqui exemplo de como se faz isso:

public List<K> findBySample(K example, String[] excludeProperty) {
		
		Session hibernateSession =  (Session) em.getDelegate();
		
		Criteria crit = hibernateSession.createCriteria(example.getClass());
		Example example = Example.create(example);
		for (String exclude : excludeProperty) {
		example.excludeProperty(exclude);
		}
		crit.add(example);
		return crit.list();
	}

Espero que isto ajude alguem.

Se souberem de uma solução melhor por favor me digam.

[]s
Ferry

A

Baixe o CaveatEmptor, aplicação referência que demonstra o uso do Hibernate…

http://www.hibernate.org/400.html

Ferryman

Valeu pela dica Taz,

Bom a implementação de findByExample no exemplo de JPA ta similar a minha… eles acabaram usando a implementação do hibernate tbm somente neste caso.

falou
[]s

Criado 4 de setembro de 2007
Ultima resposta 6 de set. de 2007
Respostas 6
Participantes 4