Join JPA @OneToMany

4 respostas
W

Galera, estou há varias horas pesquisando e não consegui resolver. Agradeço ajudas.
Quero fazer em JPA a query abaixo que retorna exatemente o que quero do banco de dados.
Como seria o código desse select em JPA?
Segue abaixo como estão modeladas as classes.

Obrigado.

SELECT

USU.CO_SEQ_USUARIO,
USU.NO_USUARIO,
CO.CO_SEQ_CONTA,
CO.NO_CONTA,
TIPCO.NO_TIPO_CONTA,
TIPCO.DS_CONTA
FROM
TB_USUARIO_PORTAL USU,
TB_CONTA CO,
TB_TIPO_CONTA TIPCO
WHERE
CO.CO_SEQ_CONTA=USU.CO_CONTA AND
TIPCO.CO_SEQ_TIPO_CONTA=CO.CO_TIPO_CONTA;

public interface DaoGenerico<T, ID extends Serializable> {
	public Class<T> getObjectClass();
        
        //Demais métodos

	public List<T> listaContaUsuario();
}
@Transactional(readOnly = true, propagation = Propagation.REQUIRED)
public class DaoGenericoImp<T, ID extends Serializable> 
implements DaoGenerico<T, ID> {

	//Interface responsável pelas operações de persitência
	private EntityManager entityManager; 

	private final Class<T> oClass;//object class

	public Class<T> getObjectClass() {
		return this.oClass;
	}

	@PersistenceContext
	public void setEntityManager(EntityManager em) {
		this.entityManager = em;
	}


	protected EntityManager getEntityManager() {
		if (entityManager == null)
			throw new IllegalStateException("Erro");
		return entityManager;
	}

	@SuppressWarnings("unchecked")
	public DaoGenericoImp() {
		this.oClass = (Class<T>)
		( (ParameterizedType) getClass().getGenericSuperclass() ).getActualTypeArguments()[0];
	}

	public List<T> listaContaUsuario(){
		
              //Select em JPA. 
	}
}
@Entity
@Table(name="tb_usuario_portal", schema="ecommerce")
public class UsuarioPortal implements Serializable{

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="co_seq_usuario")
	private Integer codUsuario;
	
	@Column(name="co_conta")
	private Integer codConta;
	
    //Demais atributos

	//getters & setters
}
@Entity
@Table(name="tb_conta", schema="ecommerce")
public class Conta implements Serializable{

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="co_seq_conta")
	private Integer codConta;
	
	@Column(name="co_tipo_conta")
	private Integer codTipoConta;
	
	//Demais atributos
	
	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
	private Set<UsuarioPortal> usuariosPortal;
	
	//getters & setters
}

4 Respostas

giovanni_dalfre

Troca para:

@OneToMany(fetch=FetchType.EAGER, cascade=CascadeType.ALL)  
    private Set<UsuarioPortal> usuariosPortal;

Acho que é isso

W

Bom, consegui resolver, não sei se existe uma maneira melhor.
Retorna uma lista de objetos onde cada objeto contém os dados do relacionamento.

Segue o código caso sirva para alguém.

String queryS = "FROM UsuarioPortal up, Conta c, TipoConta tc WHERE c.codConta=up.codConta AND tc.codTipoConta=c.codTipoConta"; Query query = getEntityManager().createQuery(queryS); List<UsuarioPortal> lista = query.getResultList();

W

giovanni_dalfre não é isso não. Eu não sabia como fazer a query em JPA. Mas vlw.

W

Ops, descobri que não está totalmente certo. A query funciona, mas a busca deveria trazer uma lista onde cada item da lista fosse um objeto com os atributos descritos na query. E está trazendo uma lista de Ojects e cada objeto com as entidades descritas na query. Desse jeito não dá pra popular o rich:datatable.

Criado 9 de agosto de 2012
Ultima resposta 9 de ago. de 2012
Respostas 4
Participantes 2