Vraptor Jpa retornar collection de um Set de Many to Many

10 respostas
adrianohardcore
Boa tarde a todos.Tenho um mapeamento many to many usando set :

Usuario

@Entity
public class Usuario extends AbstractEntity {

	private static final long serialVersionUID = 7649818757373046718L;

	private String nome;
	private String email;
	private String senha;
	
	@ManyToMany(mappedBy="usuarios", cascade = CascadeType.ALL)     
              private Set<Regra> regras = new HashSet<Regra>(0);	
   
   //Getters and Setters

Regra

@Entity
public class Regra extends AbstractEntity {	
	
	private static final long serialVersionUID = 1L;
	
	
	private String nome;	
	
	@ManyToMany(fetch = FetchType.LAZY)  
    @JoinTable(name="usuario_regra",   
               joinColumns={@JoinColumn(name="idregra")},   
               inverseJoinColumns={@JoinColumn(name="idusuario")})  
    private Set<Usuario> usuarios = new HashSet<Usuario>(0);
    
    //Getters and Setters

No Controller usuario quero mostrar todas as regras associados à aquele usuário , mas até agora só consegui fazer que retorne todas as regras:
UsuarioController

@Get("/usuario/{usuario.id}")
	public void exibir(Usuario usuario) {
		usuario = repository.loadById(usuario.getId());
		
		@SuppressWarnings("unchecked")
		List <Regra> regraList = (List<Regra>) repository.mostrarRegras(usuario.getId());		

		result.include("usuario", usuario);
		result.include("regraList", regraList);
	}

Adicionei um mostrarRegras no repository

public Regra mostrarRegras(long id) {
		String hql = "select r.nome from Regra r , Usuario u where u.regras = r.id and u.id = :id";			
		
		Query query = (Query) manager.createQuery(hql)
			.setParameter("id", id);
		
		return (Regra) query.list();
	}

E na jsp estou tentando mostrar o resultado assim

<c:forEach items="${regraList}" var="regra">
		<h2>${regra.nome}</h2>		
	</c:forEach>

Mas ao testar aparesse a seguinte erro:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.persistence.PersistenceException: org.hibernate.TypeMismatchException: left and right hand sides of a binary logic operator were incompatibile [java.util.Set(br.com.wbotelhos.movy.model.Usuario.regras) : long]

Aparentemente é um erro de compatibilidade entre o Set e long ?
Oque estaria errado no meu código ?Obrigado !

10 Respostas

A

cara,

isso aqui nao é hql

String hql = "select r.nome from Regra r , Usuario u where u.regras = r.id and u.id = :id";

é assim

String hql = "select r from Regra r  join r.usuarios u where  u.id = :id";

t+

adrianohardcore

alissonvla:
cara,

isso aqui nao é hql

String hql = "select r.nome from Regra r , Usuario u where u.regras = r.id and u.id = :id";

é assim

String hql = "select r from Regra r  join r.usuarios u where  u.id = :id";

t+

Obrigado ! Agora o erro é:
br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.ClassCastException: org.hibernate.ejb.QueryImpl cannot be cast to org.hibernate.Query

Não achei um tutorial de Vraptor que use relacionamentos many to many , one to many … Teria algum para indicar , pois só consigo fazer o básico .

A

seu metodo tem que ficar assim

public List<Regra> mostrarRegras(long id) {  
        String hql = "select r from Regra r  join r.usuarios u where  u.id = :id";           
          
        Query query = manager.createQuery(hql)  
            .setParameter("id", id);  
          
        return query.list();  
    }

t+

adrianohardcore

alissonvla:
seu metodo tem que ficar assim

public List<Regra> mostrarRegras(long id) {  
        String hql = "select r from Regra r  join r.usuarios u where  u.id = :id";           
          
        Query query = manager.createQuery(hql)  
            .setParameter("id", id);  
          
        return query.list();  
    }

t+

O erro agora é :

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from javax.persistence.Query to org.hibernate.Query

Com o código que vc me passou , o Eclipse pediu para Add cast to Query ou change type of query to Query
na primeira sugestão , foi trocado o seguinte código

Query query = (Query) manager.createQuery(hql).setParameter("id", id);

e o erro foi :

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.persistence.PersistenceException: org.hibernate.TypeMismatchException: left and right hand sides of a binary logic operator were incompatibile [java.util.Set(br.com.wbotelhos.movy.model.Usuario.regras) : long]

e na segunda sugestão o código foi trocado por:

javax.persistence.Query query = manager.createQuery(hql).setParameter("id", id);    
            
        return ((Query) query).list();

e o erro foi o mesmo:

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: javax.persistence.PersistenceException: org.hibernate.TypeMismatchException: left and right hand sides of a binary logic operator were incompatibile [java.util.Set(br.com.wbotelhos.movy.model.Usuario.regras) : long]

A

cara,

vc nao ta importando mais de um tipo de Objeto Query, vc so tem q importar o query da javax.persistence.Query,
tenta passar long para Long.

t+

adrianohardcore

alissonvla:
cara,

vc nao ta importando mais de um tipo de Objeto Query, vc so tem q importar o query da javax.persistence.Query,
tenta passar long para Long.

t+

Tive que sair … Não entendi oque devo fazer !

adrianohardcore

Up , mais alguem pode me ajudar ?

Lucas_Cavalcanti

você importou a Query do hibernate, lá no começo do arquivo… apague o import e mande importar a query da jpa.

adrianohardcore

Refiz o método mostrarRegras para

@SuppressWarnings("unchecked")
	public List<Regra> mostrarRegras(long id) {    
        String hql = "select r from Regra r  join r.usuarios u where  u.id = :id";             
        Query query = manager.createQuery(hql)    
            .setParameter("id", id);                
        return query.getResultList();   
    }

e claro , importei o import javax.persistence.Query e agora finalmente deu certo.Muito obrigado , depois de quase 1 mês que desisti de tentar fazer , até que emfim !!Vou tirar férias mês que vem e vou cair matando no Vraptor!!!

adrianohardcore

alissonvla:
cara,

vc nao ta importando mais de um tipo de Objeto Query, vc so tem q importar o query da javax.persistence.Query,
tenta passar long para Long.

t+

Obrigado , vc já tinha me respondido mas não tinha entendido !

Criado 5 de novembro de 2011
Ultima resposta 29 de nov. de 2011
Respostas 10
Participantes 3