Metodo com CriteriaBuilder apresentando erro no return

Alguma alma caridosa poderia me dizer o que esta errado neste método ?

O Eclipse pede para fazer um CAST, porém, ao colocar o (Conta), dá um erro relacionado ao CAST.

public Conta buscarFavoritaTeste(Usuario usuario) {

	CriteriaBuilder builder = session.getCriteriaBuilder();
	CriteriaQuery<Conta> criteria = builder.createQuery(Conta.class);
	Root<Conta> contaRoot = criteria.from(Conta.class);
	criteria.select(contaRoot);
	criteria.where(builder.equal(contaRoot.get("usuario"), usuario));
	criteria.where(builder.equal(contaRoot.get("favorita"), true));
	List<Conta> contaList = session.createQuery(criteria).getResultList();

	return contaList;
}

Este código é para tentar substituir o DEPRECATED abaixo:

public Conta buscarFavorita(Usuario usuario) {

	Criteria criteria = this.session.createCriteria(Conta.class);
	criteria.add(Restrictions.eq("usuario", usuario));
	criteria.add(Restrictions.eq("favorita", true));
	return (Conta) criteria.uniqueResult();
}

Faço assim e funciona:

		CriteriaBuilder builder = session.getCriteriaBuilder();
		CriteriaQuery<Conta> criteria = builder.createQuery(Conta.class);
		Root<Conta> contaRoot = criteria.from(Conta.class);

		TypedQuery<Conta> typedQuery = session.createQuery(
			criteria.select(contaRoot).where(
		     	builder.and(
		     			builder.equal(contaRoot.get("usuario"), usuario),
		     			builder.equal(contaRoot.get("favorita"), true)
		     	)
		     )
		);
		
		List<Conta> contaList = typedQuery.getResultList();
1 curtida

Você declarou o método para retornar um objeto do tipo Conta, entretanto esta fazendo o return de um objeto do tipo List.

1 curtida

Staroski, provavelmente é este mesmo o problema que esta ocorrendo. Você saberia como resolver esta questão ?

Incrível que 4 linhas que estavam funcionando perfeitamente, na mudança de versão do Hibernate, se transformaram em 8…

Estou apenas em aprendizado e o sistema em si, é apenas um treinamento, nada real.

PicklesDog70, Continua com o mesmo problema, pois o returno no método não esta coerente com o tipo declarado no método.

Mas valeu pelo código, pois aprendi mais uma com este “builder.and”

Abs

O que você quer que o método retorne?
Se for uma lista, ajuste a assinatura pra retornar uma lista.
Se for um único objeto, ajuste o código para retornar só um e não a lista.

1 curtida

Grande e paciente Staroski !

Com suas dicas, peguei o código do amigo PiklesDog70 e fiz uma pequena alteração, e para minha surpresa deu certo e nem precisei fazer um cast como no método(deprecated) que existia e funcionava. Envio abaixo para sua análise, se for possível. abs

public Conta buscarFavoritaTeste(Usuario usuario) {

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Conta> criteria = builder.createQuery(Conta.class);
Root<Conta> contaRoot = criteria.from(Conta.class);

TypedQuery<Conta> typedQuery = session.createQuery(
	criteria.select(contaRoot).where(
     	builder.and(
     			builder.equal(contaRoot.get("usuario"), usuario),
     			builder.equal(contaRoot.get("favorita"), true)
     	)
     )
);

Conta contaList = typedQuery.getSingleResult();// alterei de List para um tipo Conta e voilá .

return contaList;
}

O único problema que vejo, é que transformei 4 linhas de código para 8 ou 9… não me conformo com isto…

Com JPA sim…aumenta… com Hibernate puro nem tanto…e com JPQL tbm não…mas perde a tipagem (q mesmo nesse caso ainda esta debilitada… )…

Mas se vc abstrair bem esse teu método e usar o generics… vc coloca grande parte do codigo em um lugar só…

1 curtida

De qualquer forma, vou dar o problema como resolvido. Ainda não tenho conhecimento para extrapolar este método.

Muito obrigado aos amigos !

1 curtida