[RESOLVIDO] Preencher datatable dados de relacionamento

20 respostas
M

[i]Bom galera, estou com 1 problema aqui que não consigo resolver de jeito nenhum. Espero que alguem consiga me ajudar. Vamos lá.

Tenho uma tabela chamada Vistoria, e nela tenho um relacionamento @OneToMany com a tabela Itens, meu sistema funciona da seguinte forma:

  • Usuario cadastra uma vistoria;
  • Após cadastrar esta vistoria ele é enviado para um outra tela para poder adicionar quantos Itens deseja para aquela Vistoria.

Meu problema está sendo exibir estes dados para o usuario quando ele pesquisar o numero da vistoria cadastrada.

Exemplo:

Usuario busca a Vistoria de numero 200, deveria ser preenchido um datatable mostrando os detalhes da Vistoria no cabeçalho e logo abaixo todos os itens cadastrados naquela vistoria.

Não consigo preencher este datatable de jeito nenhum, não aparece nenhum dado.

Alguem pode me ajudar com isso?

Meus códigos:[/i]

// Classe Vistoria com o mapeamento de Item
@Entity
public class Vistoria implements Serializable {

	// Outros atributos omitidos

	@OneToMany(mappedBy = "vistoria")
	private List<Item> itens = new ArrayList<Item>();

}

// Classe Item com o mapeamento de Vistoria
@Entity
public class Item implements Serializable {

	// Outros atributos omitidos

	@ManyToOne
	@JoinColumn(name = "vistoria_id")
	private Vistoria vistoria = new Vistoria();

}

// Método responsavel por fazer o select
try {
	return session.createCriteria(Vistoria.class, "v").add(Restrictions.eq("v.numero", num)).list();
} catch (Exception e) {
	session.getTransaction().rollback();
	e.printStackTrace();
} finally {
	session.close();
}

[i]
Enfim, não sei o que estou fazendo de errado, com este método não aparece nenhum dado no datatable.

Meu contexto: JSF2 + Primefaces + Hibernate …

Estou no aguardo galera…

Obrigadoo.[/i]

20 Respostas

d34d_d3v1l

Posso sugerir uma alternativa?

Faz um HQL para retornar uma lista de itens…

d34d_d3v1l

PS: nao manjo de criteria …

M

[i]
Então d34d_d3v1l, nesta criteria ele está listando tudo que tem na tabela vistoria com o numero que eu passei ali.

Acredito que daria na mesma fazer um HQL :S[/i]

EDIT

Apenas para teste fiz uma classe com um método e rodei ele num main, oh:

public void run() {
	try {
		List<Vistoria> vistorias = session.createCriteria(Vistoria.class, "v").add(Restrictions.eq("v.num", 43L)).list();
					
		for(Vistoria v : vistorias){
			System.out.println(v.getAno());
			System.out.println(v.getData());
			
			for(Item i : v.getItens()){
				System.out.println(i.getLatitude());
				System.out.println(i.getLongitude());
			}
		
			System.out.println(v.getResponsavel());
		}
	}
}

Incrivelmente listo tudo certinho, não sei o que estou fazendo de errado para não aparecer na view :S

d34d_d3v1l

é…
entãoo desculpa mas nao posso te ajudar.
Nunca estudei JSF e tal

o jakefog talvez possa ajudar
(nao mande MP para ele… kkkk)
o blog dele é o seguibte:
http://uaihebert.com/

Hebert_Coelho

Eita, eu senti que alguém tinha falado meu nome! Mahauahaa

Tem como você colocar apenas o método do ManagedBean que faz a consulta? E informar qual o escopo dele?

M

jakefrog:
Eita, eu senti que alguém tinha falado meu nome! Mahauahaa

Tem como você colocar apenas o método do ManagedBean que faz a consulta? E informar qual o escopo dele?

[i]hahaha pois eh jake…

então ta aqui o método:[/i]

public List<Vistoria> getListaVistoriasNumero() {
	System.out.println(numero);

	if (listaVistoriasNumero.isEmpty() || numero != null) {
		listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

		return listaVistoriasNumero;
	} else {
		return listaVistoriasNumero;
	}
}

[i]
O MB está anotado como @viewscoped

na view estou fazendo assim:[/i]

<h:panelGrid columns="5" cellpadding="1" cellspacing="1">
	<h:outputLabel id="lbNumero" value="Digite o número: "
				for="txtNumero" style="float: right; font-weight: bold;" />
	<p:inputText id="txtNumero" value="#{mbBuscaVistoria.numero}"
				required="true" requiredMessage="[Numero] é obrigatório" />

	<p:spacer width="5" />
	<p:spacer width="5" />

	<p:commandButton value="Buscar" icon="ui-icon-search">
		<p:ajax process="@this" update="dtVistorias" />
	</p:commandButton>
</h:panelGrid>

<p:dataTable id="dtVistorias" value="#{mbBuscaVistoria.listaVistoriasNumero}" var="v" emptyMessage="Nenhum registro encontrado">

		<f:facet name="header">
			<h:outputText value="Lista de vistoria" />
		</f:facet>

		<p:column headerText="Data">
			<h:outputText value="#{v.data}" />
		</p:column>

</p:dataTable>

[i]
Coloquei para mostrar apenas a data só como teste… e não mostrou…

Aquele sysout que eu fiz ali foi só para teste mesmo e o numero q o usuario deveria passar na view está chegando no método…

To no aguardo aqui ^^[/i]

Hebert_Coelho

Tente dar update no form e não no update=“dtVistorias”.

Veja oq acontece.

M

jakefrog:
Tente dar update no form e não no update=“dtVistorias”.

Veja oq acontece.

[i]Não mudo nada jake, ele executa o método normalmente também, mostra o numero que foi passado mais a datatatable não é preenchido.

Não sei oq ta acontecendo :S[/i]

Hebert_Coelho

Você tem como verificar se o numero está chegando? Fazer um debug aí? Eu diria que não, pois o process está com @this e apenas o botão é enviado. O.o

obs.: você pode mudar teu if para que vai dar no mesmo e será menos código:

if (listaVistoriasNumero.isEmpty() || numero != null) { listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero); } return listaVistoriasNumero;

M

jakefrog:
Você tem como verificar se o numero está chegando? Fazer um debug aí? Eu diria que não, pois o process está com @this e apenas o botão é enviado. O.o

obs.: você pode mudar teu if para que vai dar no mesmo e será menos código:

if (listaVistoriasNumero.isEmpty() || numero != null) { listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero); } return listaVistoriasNumero;

Então jake, pelo que eu li o @this ele processa o form mais proximo, não é? Me corrija se estiver errado.

Enfim, fiz as alterações e ficou assim:

public List<Vistoria> getListVistoriasNumero() {
	System.out.println("Numero antes do IF: " + numero);

	if (listaVistoriasNumero.isEmpty() || numero != null) {
		System.out.println("Numero dentro do IF: " + numero);
		listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

		return listaVistoriasNumero;
	}
		
	return listaVistoriasNumero;

}

Quando mando fazer a busca recebo isto no console:

Numero antes do IF: 43
Numero dentro do IF: 43
17/09/2012 18:13:32 - INFO  com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager [462]  - Initializing c3p0 pool...  .......
Hibernate: 
    select
        this_.id as id263_10_,
        this_.ano as ano263_10_,
        this_.data as data263_10_,
        this_.empresa_id as empresa9_263_10_,
        this_.hora_fim as hora4_263_10_,
        this_.hora_inicio as hora5_263_10_,
        this_.km_fim as km6_263_10_,
        this_.km_inicio as km7_263_10_,
        this_.municipio_fim_id as municipio10_263_10_,
        this_.municipio_inicio_id as municipio11_263_10_,
        this_.nota as nota263_10_,
        this_.regional_id as regional12_263_10_,
        this_.usuario_responsavel_id as usuario13_263_10_,
        this_.sp_id as sp14_263_10_,
        empresa2_.id as id256_0_,
        empresa2_.lote_id as lote3_256_0_,
        empresa2_.nome as nome256_0_,
        lote3_.id as id258_1_,
        lote3_.lote as lote258_1_,
        municipio4_.id as id252_2_,
        municipio4_.nome as nome252_2_,
        municipio5_.id as id252_3_,
        municipio5_.nome as nome252_3_,
        regional6_.id as id261_4_,
        regional6_.lote_id as lote3_261_4_,
        regional6_.regional as regional261_4_,
        lote7_.id as id258_5_,
        lote7_.lote as lote258_5_,
        usuario8_.username as username255_6_,
        usuario8_.empresa_id as empresa5_255_6_,
        usuario8_.enable as enable255_6_,
        usuario8_.name as name255_6_,
        usuario8_.password as password255_6_,
        empresa9_.id as id256_7_,
        empresa9_.lote_id as lote3_256_7_,
        empresa9_.nome as nome256_7_,
        sp10_.id as id259_8_,
        sp10_.kmFinal as kmFinal259_8_,
        sp10_.kmInicio as kmInicio259_8_,
        sp10_.nome as nome259_8_,
        sp10_.numero as numero259_8_,
        sp10_.regional_id as regional6_259_8_,
        regional11_.id as id261_9_,
        regional11_.lote_id as lote3_261_9_,
        regional11_.regional as regional261_9_ 
    from
        Vistoria this_ 
    left outer join
        Empresa empresa2_ 
            on this_.empresa_id=empresa2_.id 
    left outer join
        Lote lote3_ 
            on empresa2_.lote_id=lote3_.id 
    left outer join
        Municipio municipio4_ 
            on this_.municipio_fim_id=municipio4_.id 
    left outer join
        Municipio municipio5_ 
            on this_.municipio_inicio_id=municipio5_.id 
    left outer join
        Regional regional6_ 
            on this_.regional_id=regional6_.id 
    left outer join
        Lote lote7_ 
            on regional6_.lote_id=lote7_.id 
    left outer join
        user usuario8_ 
            on this_.usuario_responsavel_id=usuario8_.username 
    left outer join
        Empresa empresa9_ 
            on usuario8_.empresa_id=empresa9_.id 
    left outer join
        SP sp10_ 
            on this_.sp_id=sp10_.id 
    left outer join
        Regional regional11_ 
            on sp10_.regional_id=regional11_.id 
    where
        this_.id=?

Será que tem a ver com todos estes joins? o.O

Não sei mais o que pensar kkkk

Obrigado por enqnt jakefrog :slight_smile:

Hebert_Coelho

Até onde sei, o @this é apenas o componente que dispara a ação.

O valor do numero está chegando no método?

Responde isso que depois a gente vai pros joins.

M

jakefrog:
Até onde sei, o @this é apenas o componente que dispara a ação.

O valor do numero está chegando no método?

Responde isso que depois a gente vai pros joins.

Ta chegando sim jake …

EDIT

Fiz uma outra coisa pra testar…
alterei meu método pra isso:

public List<Vistoria> getListVistoriasNumero() {
	System.out.println("Numero antes do IF: " + numero);

	if (listVistoriasNumero.isEmpty() || numero != null) {
		System.out.println("Numero dentro do IF: " + numero);
		listVistoriasNumero = new VistoriaDAO().listByID(numero);

		for (Vistoria v : listVistoriasNumero) {
			System.out.println(v.getData());
			System.out.println(v.getAno());
		}

		return listVistoriasNumero;
	}

	return listVistoriasNumero;
}

Recebo isso no console:

Numero antes do IF: 43 <----
Numero dentro do IF: 43  <----
17/09/2012 18:25:11 - INFO  com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager [462]  - Initializing c3p0 pool...  .....
Hibernate: 
    select
        this_.id as id199_10_,
        this_.ano as ano199_10_,
        this_.data as data199_10_,
        this_.empresa_id as empresa9_199_10_,
        this_.hora_fim as hora4_199_10_,
        this_.hora_inicio as hora5_199_10_,
        this_.km_fim as km6_199_10_,
        this_.km_inicio as km7_199_10_,
        this_.municipio_fim_id as municipio10_199_10_,
        this_.municipio_inicio_id as municipio11_199_10_,
        this_.nota as nota199_10_,
        this_.regional_id as regional12_199_10_,
        this_.usuario_responsavel_id as usuario13_199_10_,
        this_.sp_id as sp14_199_10_,
        empresa2_.id as id207_0_,
        empresa2_.lote_id as lote3_207_0_,
        empresa2_.nome as nome207_0_,
        lote3_.id as id201_1_,
        lote3_.lote as lote201_1_,
        municipio4_.id as id208_2_,
        municipio4_.nome as nome208_2_,
        municipio5_.id as id208_3_,
        municipio5_.nome as nome208_3_,
        regional6_.id as id204_4_,
        regional6_.lote_id as lote3_204_4_,
        regional6_.regional as regional204_4_,
        lote7_.id as id201_5_,
        lote7_.lote as lote201_5_,
        usuario8_.username as username203_6_,
        usuario8_.empresa_id as empresa5_203_6_,
        usuario8_.enable as enable203_6_,
        usuario8_.name as name203_6_,
        usuario8_.password as password203_6_,
        empresa9_.id as id207_7_,
        empresa9_.lote_id as lote3_207_7_,
        empresa9_.nome as nome207_7_,
        sp10_.id as id198_8_,
        sp10_.kmFinal as kmFinal198_8_,
        sp10_.kmInicio as kmInicio198_8_,
        sp10_.nome as nome198_8_,
        sp10_.numero as numero198_8_,
        sp10_.regional_id as regional6_198_8_,
        regional11_.id as id204_9_,
        regional11_.lote_id as lote3_204_9_,
        regional11_.regional as regional204_9_ 
    from
        Vistoria this_ 
    left outer join
        Empresa empresa2_ 
            on this_.empresa_id=empresa2_.id 
    left outer join
        Lote lote3_ 
            on empresa2_.lote_id=lote3_.id 
    left outer join
        Municipio municipio4_ 
            on this_.municipio_fim_id=municipio4_.id 
    left outer join
        Municipio municipio5_ 
            on this_.municipio_inicio_id=municipio5_.id 
    left outer join
        Regional regional6_ 
            on this_.regional_id=regional6_.id 
    left outer join
        Lote lote7_ 
            on regional6_.lote_id=lote7_.id 
    left outer join
        user usuario8_ 
            on this_.usuario_responsavel_id=usuario8_.username 
    left outer join
        Empresa empresa9_ 
            on usuario8_.empresa_id=empresa9_.id 
    left outer join
        SP sp10_ 
            on this_.sp_id=sp10_.id 
    left outer join
        Regional regional11_ 
            on sp10_.regional_id=regional11_.id 
    where
        this_.id=?
2012-09-12 <----
2012 <----

Tem algum problema na minha view :S

Mais não sei o que e kkkk.

Hebert_Coelho

Beleza.

Este cara, listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

Após passar por essa linha, tem valor?

M

jakefrog:
Beleza.

Este cara, listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

Após passar por essa linha, tem valor?

Tem sim jake, dei uma editada ali acho que depois de você postar kkk

Mais tem itens dento dessa lista sim…

Hebert_Coelho

mihawk~:
jakefrog:
Beleza.

Este cara, listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

Após passar por essa linha, tem valor?

Tem sim jake, dei uma editada ali acho que depois de você postar kkk

Mais tem itens dento dessa lista sim…

Mais um teste. Para cada vez que o getListVistoriasNumero é chamado, todas ele retorna o valor correto na lista?

M

jakefrog:
mihawk~:
jakefrog:
Beleza.

Este cara, listaVistoriasNumero = new VistoriaDAO().listarPorNum(numero);

Após passar por essa linha, tem valor?

Tem sim jake, dei uma editada ali acho que depois de você postar kkk

Mais tem itens dento dessa lista sim…

Mais um teste. Para cada vez que o getListVistoriasNumero é chamado, todas ele retorna o valor correto na lista?

Quando ele entra no if sim…

Seria uma boa tirar o preenchimento da lista do get?

Hebert_Coelho

mihawk~:
Quando ele entra no if sim…

Seria uma boa tirar o preenchimento da lista do get?

Cara, você tem que ver se toda vez ele retorna o valor correto.
A lista retornada tem o valor correto sempre? Em todas as vezes que o método get é chamado?

M

jakefrog:
mihawk~:
Quando ele entra no if sim…

Seria uma boa tirar o preenchimento da lista do get?

Cara, você tem que ver se toda vez ele retorna o valor correto.
A lista retornada tem o valor correto sempre? Em todas as vezes que o método get é chamado?

Então jake, ele retorna o valor correto sim quando entra no IF…

Enfim, eu fiz isso na view:

<p:commandButton value="Buscar" icon="ui-icon-search" ajax="false">
	<p:ajax process="@this" update="dtVistorias" />
</p:commandButton>

Agora ta funcionando o.O … Vai entender…

Sabe me explicar o porque jake?

Hebert_Coelho

Cara, eu teria que olhar todo teu código.

Olhando por alto assim sei não.

Pelo menos funcionou.

Caso você queria ver como eu faço, aqui tem: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Eu sei que assim funciona e eu sei explicar o funcionamento. [=

M

jakefrog:
Cara, eu teria que olhar todo teu código.

Olhando por alto assim sei não.

Pelo menos funcionou.

Caso você queria ver como eu faço, aqui tem: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

Eu sei que assim funciona e eu sei explicar o funcionamento. [=

Ah tudo bem então jakefrog, obrigado pela ajuda e pela indicação do post :slight_smile:

Vou colocar como resolvido ^^

Criado 16 de setembro de 2012
Ultima resposta 17 de set. de 2012
Respostas 20
Participantes 3