Olá pessoal, esotu usando o JPA com Hibernate para persistência. Tenho uma tabela usuario no banco, e na classe Usuario, faço o mapeamento da lista de amigos:
@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
private Set<Usuario> amigos;
@ManyToMany(mappedBy = "amigos", fetch = FetchType.LAZY)
private Set<Usuario> amigados;
No banco o Hibernate criou a tabela “usuario_usuario”, com dois campos: amigos_id e amigados_id. Até aqui blz, tenho um DAO que retorna uma lista de amigos com a seguinte query e funciona de boa:
SELECT amigo FROM Usuario u JOIN u.amigos amigo
Acontece que essa query é mto lenta, pois se um usuário tem uns 500 amigos, demora demais. O Hibernate cria uma query do tamanho do universo pra me trazer essa lista.
Fiz uma query no MySQL que vai direto no indice da tabela usuario_usuario:
SELECT amigados_id FROM usuario_usuario WHERE amigos_id = 123
Essa query seria perfeita, pois ela me traz o indice na mesma hora. É praticamente instantanea.
Em vez de usar query normal (JPAQuery), passei a usar queryNativa do JPA. O problema está em criar esta query nativa no JPA.
public List<Usuario> getAmigos(Usuario usuario) {
Query q = entityManager.createNativeQuery("SELECT amigos_id FROM usuario_usuario WHERE amigados_id = :idUsuario", Usuario.class);
q.setHint("org.hibernate.cacheable", true);
q.setParameter("idUsuario", usuario.getId());
return getQueryResultList(q);
}
Ele me retorna um => java.sql.SQLException: Column ‘id’ not found. Parece que ele não tá identificando aquele campo (amigos_id) com um usuário em si, mesmo fazendo o cast.
Pesquisei, procurei e ainda nao achei uma forma de fazer o hibernate associar o campo "amigados_id" com um "objeto" Usuario. Tenho que criar uma classe só pra esse relacionamento?
Agradeço a atenção