Hibernate: ajuda com createsqlquery e datatable

10 respostas
pimentaft

Olá!
Como faço para criar um createsqlquery e montar uma lista no datatable?

Ex: Eu quero listar todos os clientes:

session.createSQLQuery("select * from cliente") 
                                    .addEntity(Cliente.class)
                                    .list();

Ate ai ele lista no datatable.
Minha dúvida é se for em um relacionamento entre 2 classes.
Ex: Quero listar todos os produtos comprados por um cliente(Cliente,itemVenda).

Alguem pode me ajudar?

10 Respostas

felipeguerra

Uma maneira de fazer é criar uma classe de modelo, que englobe propriedades de ambas as classes e iterar através do dataTable.

Digamos que vc tenha uma classe ClienteProdutoModel, aí no seu Managed Bean vc pode ter um atributo do tipo: List<ClienteProdutoModel>.

Entendeu?

pimentaft

Opa!
Obrigado por me responder!
Entendi sim!
Cria na classe entidade Cliente um List q receberia todos os produtos.
O meu problema maior é qdo eu tenho q ir em 2 ou mais tabelas pegar informações.
Ex:

select p.nomeproduto,p.preco,i.data_venda,c.nomecliente from 
                                              produto p,item i,cliente c where
                                              p.codproduto = i.codproduto and
                                              c.codcliente = i.codcliente and
                                              c.codcliente = 1;

Em hibernate:

session.createSQLQuery("select p.nomeproduto,p.preco,i.data_venda,c.nomecliente from 
                                              produto p,item i,cliente c where
                                              p.codproduto = i.codproduto and
                                              c.codcliente = :codcliente")
           .addEntity(???) //nao sei o q colocar ou se devo colocar, se coloco ele diz q tem nome de campo invalido.E se nao coloco ele nao lista no datatable, mas dá retorno.
           .setParameter("codcliente","1")
           .list();

Se puder me explicar… :oops:

felipeguerra

Antes de mais nada, pq vc não cria o relacionamento entre as entidades no Hibernate?

Tem todas as questões de configuração, mas vale a pena, é algo consolidado já!

pimentaft

Opa!vlw mais uma vez…
Eu coloquei isso como exemplo, vou te mostrar o que eu to tentando fazer:

Eu tenho as entidades turma, sala e aloca(classe associativa), e eu quero mostrar no datatable todas as turmas que estao alocadas na sala num determinado dia de semana:
Se vc tiver uma ideia mais simples, por favor me de uma luz.
Vlw!
Os codigos seguem abaixo:

@Entity
public class Turma implements Serializable{
	@Id
	@Column(name="codturma")
	private String codTurma;
	@Column(name="turno")
	private String turno;
	@Column(name="nometurma")
	private String nomeTurma;
	@Column(name="codserie")
	private String codSerie;
	@Column(name="periodo")
	private String periodo;
	@Column(name="codcurso")
	private String codCurso;
	@Column(name="codespecializacao")
	private String codEspecializacao;
	@Column(name="seq")
	private String seq;

//gets e setts omitidos
}
@Entity
@Table(name="aloca_turma_sala")
public class Aloca implements Serializable{
	
	@EmbeddedId
	private AlocaPK id;
	
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codcampus",insertable=false,updatable=false)
	private Campus campus;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumns(value={
				@JoinColumn(name="codcampus",insertable=false,updatable=false),
				@JoinColumn(name="codbloco",insertable=false,updatable=false)
		})
	private Bloco bloco;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codpavimento",insertable=false,updatable=false)
	private Pavimento pavimento;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
	@JoinColumns(value={
			@JoinColumn(name="codcampus",insertable=false,updatable=false),
			@JoinColumn(name="codbloco",insertable=false,updatable=false),
			@JoinColumn(name="codpavimento",insertable=false,updatable=false),
			@JoinColumn(name="codsala",insertable=false,updatable=false),
			@JoinColumn(name="codtiposala",insertable=false,updatable=false)
	})
	private Sala sala;
	@ManyToOne(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
		@JoinColumn(name="codturma",insertable=false,updatable=false)
	private Turma turma;
	@Column(name="horainicio",insertable=false,updatable=false)
	private String horaInicio;
	@Column(name="horafim",insertable=false,updatable=false)
	private String horaFim;
	@Column(name="diasemana",insertable=false,updatable=false)
	private String diaSemana;
                //gets  e sets omitidos

o bean bAloca, metodo da consulta:

public String confirmaAlocaForm(){
		String retorno = "sucesso";
		//buscar as turmas alocadas na sala
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			SalaPK id = new SalaPK();
			id.setCodSala(codsala);
			id.setCodBloco(codbloco);
			id.setCodCampus(codcampus);
			id.setCodPavimento(codpavimento);
			id.setCodTipoSala(codtiposala);
			Sala sala = new Sala();
			sala.setId(id);
			listaTurmasSala = new AlocaDao(session).mostraTurmasAlocadas(sala,diasemana);
			Hibernate.initialize(listaTurmasSala);
			System.out.println("total de turmas: "+listaTurmasSala.size());
		}catch (Exception e) {
			System.out.println("falha ao buscar as turmas alocadas na sala");
			e.printStackTrace();
		}
		finally{
			session.close();
		}
		return retorno;
	}

O dao:

public List mostraTurmasAlocadas(Sala sala,String diasemana){
		 return this.session.createSQLQuery("select t.nometurma,t.periodo,t.turno,a.horainicio,a.horafim from aloca_turma_sala a ,turma t where t.codturma = a.codturma and a.codcampus = :codcampus and a.codbloco = :codbloco and a.codpavimento = :codpavimento and a.codsala = :codsala and a.diasemana = :diasemana")
		    .addScalar("nomeTurma", Hibernate.STRING)//coloquei pois dava erro de for input string neste campo
		    .setParameter("codcampus", sala.getId().getCodCampus())
		    .setParameter("codbloco", sala.getId().getCodBloco())
		    .setParameter("codpavimento", sala.getId().getCodPavimento())
		    .setParameter("codsala", sala.getId().getCodSala())
		    .setParameter("diasemana", diasemana)
		    .list();
	}
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%><%@taglib
	uri="http://java.sun.com/jsf/html" prefix="h"%><%@taglib
	uri="http://richfaces.org/a4j" prefix="a4j"%><%@taglib
	uri="http://richfaces.org/rich" prefix="rich"%><%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Confirmação da alocação</title>
</head>
<body>
	<f:view>
	<h:form>
		<h4>Dados da sala</h4><br>
		<a4j:keepAlive beanName="bAloca"/>
		<b><h:outputText value="Descrição: "/></b><h:outputText value="#{bAloca.dadosSala.dscSala}"/>     
		<b><h:outputText value="Capacidade: "/></b><h:outputText value="#{bAloca.dadosSala.capacidade}"/><br>
		<b><h:outputText value="Ar condicionado: "/></b><h:outputText value="#{bAloca.dadosSala.arCondicionado}"/>
		<b><h:outputText value="Ventilador: "/></b><h:outputText value="#{bAloca.dadosSala.ventilador}"/><br>
		<b><h:outputText value="Tipo de quadro: "/></b><h:outputText value="#{bAloca.dadosSala.tipoQuadro}"/><br>
		<h4>Turmas alocadas nesta sala</h4><br>
		<h:dataTable border="1" id="turmasalocadas" value="#{bAloca.listaTurmasSala}" var="turmas">
			<h:column id="nomedaturma">
				<f:facet name="header">
					<h:outputText value="nome da turma"></h:outputText>
				</f:facet>
				<h:outputText value="#{turmas.nometurma}"></h:outputText>
			</h:column>
		</h:dataTable>

	</h:form>
</f:view>
</body>
</html>
felipeguerra

Tem algum motivo para não criar um relacionamento entre Turma e Sala?

Uma Sala tem muitas Turmas, certo?

pimentaft

É a classe Aloca, mencionada acima.

felipeguerra

Não, eu to falando disso:

public class Turma {

}

public class Sala {
 
   private List&lt;Turma&gt; turmas;

   @ManyToOne(fetch=FetchType.LAZY)
   public List&lt;Turma&gt; getTurmas() {
      return turmas;
   }

}
pimentaft

Tá errado da maneira que eu fiz? Me desculpe, eu estou começando a pouco tempo com hibernate.

felipeguerra

Não é meu propósito discutir se está certo ou errado, eu coloquei dessa forma, pois, na hora de vc criar sua consulta aplicando critérios (Criteria API), vc vai trazer os dados que atendam suas necessidades mais facilmente… :wink:

Se outra pessoa responder, pode ser que enchergue de outra forma…

felipeguerra

Em consultas simples, eu prefiro usar Criteria, mas isso é uma questão particular minha!

Criado 14 de novembro de 2008
Ultima resposta 14 de nov. de 2008
Respostas 10
Participantes 2