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