SELECT no banco passando como parâmetro um item de um Listbox

Eae pessoal, beleza?

Dexa eu tentar explicar o que quero fazer mas estou apanhando…
Tenho um listbox que é populado com os dados do BD de uma tabela “dataset_inicial”… Quero fazer uma busca no banco na tabela “imagem_inicial” de todas as imagens cujo paramentro é “dataset_inicial” que eu escolher no meu listbox… (relacionamento de 1:N)
A verdade é que eu não sei como fazer, e fui tentando de varias maneiras, pesquisei… mas não consegui… ae venho mais uma vez pedir a ajuda de voces :oops:
Se alguem puder me ajudar, agradeço desde já!

o MB

@ManagedBean
@ViewScoped
public class ConsultaImagemBean {

	@ManagedProperty(value="#{entityManagerBuilder.entityManager}")
	private EntityManager entityManager;
		
	private Imagem_inicial imagem_selecionado;
	private List<Imagem_inicial> lista;
	private boolean todos_diretorios;

	public void Pesquisar(){
		try {
			if (todos_diretorios == true){
				lista = getEntityManager().createQuery("from Imagem_inicial").getResultList();
			} else {
                                //O PROBLEMA ESTA AQUI! NAO SEI COMO FAZER ;S
				Query query = getEntityManager().createQuery("select im from Imagem_inicial im where im.dataset_ini = :dataset_ini");
				query.setParameter("dataset_ini", /*O QUE POR AQUI PRA DAR CERTO?*/);
				lista = query.getResultList();
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
        //GETTERS E SETTERS

o Model

@Entity
@Table(name="imagem_inicial")
public class Imagem_inicial implements Serializable {

	private static final long serialVersionUID = 6620894928054638720L;
	
	@Id
	@SequenceGenerator(name="imageini", sequenceName="imagem_inicial_id_imageini_seq",allocationSize=1)
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="imageini")
	@Column(name="id_imageini", unique=true, nullable=false)
	private Integer idImageini;
	
	@NotNull
	@Column(name="caminho")
	private String caminho;

	@NotNull
	@Column(name="nome_imagem")
	private String nome_imagem;
	
	@NotNull
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "id_datasetini")
	private Dataset_inicial dataset_ini;
	//GETTERS E SETTERS

xhtml

<h:panelGrid style="margin-left: 200px">
	<h:outputLabel value="Busca pelo diretório:" />
       	<h:selectOneListbox id="busca_diretorio" disabled="#{consultaImagemBean.todos_diretorios}" value="#{dataset_inicialBean.dataini_selecionado}" style="width:200px; height:100px">
		<f:selectItems value="#{dataset_inicialBean.lista}" var="dataini" itemValue="#{dataini.id_datasetini}" itemLabel="#{dataini.nome_datasetini}" />   
	</h:selectOneListbox>
</h:panelGrid>
<p:spacer height="20"/>
<p:separator />
<p:commandButton value="Pesquisar" action="#{consultaImagemBean.Pesquisar()}" update="dtbusca" icon="ui-icon-search" title="Pesquisar"/>
<br />
<p:dataTable id="dtbusca" emptyMessage="Nenhuma imagem encontrada" paginator="true" rows="15" value="#{consultaImagemBean.lista}" var="image_i" >
	<p:column headerText="ID" style="width: 70px; text-align: center">
		#{image_i.idImageini}
	</p:column>
	<p:column headerText="Nome arquivo Fits">
		#{image_i.nome_imagem}
	</p:column>
</p:dataTable>

Olá pcsantana,

tente fazer o seguinte:

:arrow: colocar uma tributo Dataset_inicial no seu ConsultaImagemBean

private Dataset_inicial datasetSelecionado;

:arrow: alterar o xhtml para o value do selectOne seja o atributo adicionado: #{consultaImagemBean.datasetSelecionado}

:arrow: setar o parâmetro da consulta com a entidade Dataset_inicial que foi selecionada

query.setParameter("dataset_ini", datasetSelecionado);  

Altere seu select para:
“select im from Imagem_inicial im where im.dataset_ini in (:dataset_ini)”
query.setParameter(“dataset_ini”, datasetSelecionado);

Esqueci: seu paramentro passar a ser do tipo List.

“select im from Imagem_inicial im where im.dataset_ini in (:dataset_ini)”
query.setParameter(“dataset_ini”, lstDatasetSelecionado);

Verdade marcusco,

já que ele está usando um listbox, pode selecionar vários e precisa passar uma lista.
O exemplo que eu passei seria com selectOneMenu.

Acho que conseguimos resolver a dúvida dele de como definir o parâmetro na consulta com o que foi selecionado no formulário.
:thumbup:

Amigos, muito obrigado pela atenção!!!

Surgiu algumas dúvidas aqui…
marcusco, quando vc diz

[quote]Esqueci: seu paramentro passar a ser do tipo List.

“select im from Imagem_inicial im where im.dataset_ini in (:dataset_ini)”
query.setParameter(“dataset_ini”, lstDatasetSelecionado);
[/quote]
no parametro “lstDatasetSelecionado”, quer dizer que devo criar um atributo do tipo list?? e usa-lo ali? Tipo assim:

private List<Dataset_inicial> lstDatasetSelecionado;

ao invés disto: (conforme o rock mencionou?)

private Dataset_inicial datasetSelecionado;

Outra coisa, como ficaria meu xhtml, nesse trecho de codigo:

<h:selectOneListbox id="busca_diretorio" disabled="#{consultaImagemBean.todos_diretorios}" value="#{consultaImagemBean.datasetini_selecionado}" style="width:200px; height:100px">  
/*NESSA LINHA*/ <f:selectItems value="#{dataset_inicialBean.lista}" var="dataini" itemValue="#{dataini.id_datasetini}" itemLabel="#{dataini.nome_datasetini}" />     
</h:selectOneListbox> 

Muito obrigado mesmo pela ajuda e atenção!!! :smiley:

[quote=pcsantana]Amigos, muito obrigado pela atenção!!!

Surgiu algumas dúvidas aqui…
marcusco, quando vc diz

[quote]Esqueci: seu paramentro passar a ser do tipo List.

“select im from Imagem_inicial im where im.dataset_ini in (:dataset_ini)”
query.setParameter(“dataset_ini”, lstDatasetSelecionado);
[/quote]
no parametro “lstDatasetSelecionado”, quer dizer que devo criar um atributo do tipo list?? e usa-lo ali? Tipo assim:

private List<Dataset_inicial> lstDatasetSelecionado;

ao invés disto: (conforme o rock mencionou?)

private Dataset_inicial datasetSelecionado;

[/quote]
Sim.


[quote]
Outra coisa, como ficaria meu xhtml, nesse trecho de codigo:

<h:selectOneListbox id="busca_diretorio" disabled="#{consultaImagemBean.todos_diretorios}" value="#{consultaImagemBean.datasetini_selecionado}" style="width:200px; height:100px">  
/*NESSA LINHA*/ <f:selectItems value="#{dataset_inicialBean.lista}" var="dataini" itemValue="#{dataini.id_datasetini}" itemLabel="#{dataini.nome_datasetini}" />     
</h:selectOneListbox> 

Muito obrigado mesmo pela ajuda e atenção!!! :D[/quote]
Seus campos input ou select terão sempre o value para algo do tipo #{managedBean.atributo} .
Então nesse caso

private List<Dataset_inicial> lstDatasetSelecionado;

o xhtml fica

<h:selectOneListbox id="busca_diretorio" disabled="#{consultaImagemBean.todos_diretorios}" value="#{consultaImagemBean.lstDatasetSelecionado}" style="width:200px; height:100px">  
  <f:selectItems value="#{dataset_inicialBean.lista}" var="dataini" itemValue="#{dataini.id_datasetini}" itemLabel="#{dataini.nome_datasetini}" />     
</h:selectOneListbox> 

esta acontecendo algo muito estranho…
quando seleciono algum item do meu listbox e clico no botao Pesquisar, ele não faz nada… não aparece os comando SQL no console…
Tenho um checkbox “Todos diretorios” que se marcado, ele faz a busca em toda a tabela… que é a condição do primeiro if… Esse funciona, mas quando desmarco o checkbox e seleciono um item (condição do else) ele não faz nada…

Outra coisa estranha é que ao desmarcar o checkbox e não selecionar nenhum item do checkbox e clicar em Pesquisar (tbm atende a condição do else), ae sim ele faz o select da segunda condição (aparece os comandos SQL), mas como nenhum item foi selecionado, ele retorna nada :S

Algum palpite do que pode ser?

Verifique o Reder e process dos componentes;

adicionei a propriedade process no componente do botao… parece que agora está realizando o comando pelo menos…

<p:commandButton value="Pesquisar" action="#{consultaImagemBean.Pesquisar()}" process="@this" update="@form" icon="ui-icon-search" title="Pesquisar"/>

mas olhe como ele se comporta:

15:42:16,956 INFO  [stdout] (http-localhost-127.0.0.1-9090-1) Hibernate: 
15:42:16,956 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)     select
15:42:16,956 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_ini0_.id_imageini as id1_9_,
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_ini0_.caminho as caminho9_,
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_ini0_.id_datasetini as id4_9_,
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_ini0_.nome_imagem as nome3_9_ 
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)     from
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_inicial imagem_ini0_ 
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)     where
15:42:16,957 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         imagem_ini0_.id_datasetini in (
15:42:16,958 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)             ?
15:42:16,958 INFO  [stdout] (http-localhost-127.0.0.1-9090-1)         )

nao retorna nada… sera que não está pegando o item o listbox? ;s

eu nao preciso fazer algum tipo de converter?

mais uma duvida… hehe
Aqui:

[quote]rock
Verdade marcusco,

já que ele está usando um listbox, pode selecionar vários e precisa passar uma lista.
O exemplo que eu passei seria com selectOneMenu.
[/quote]
Eu não vou selecionar varios (e acho que nem dá)… vou selecionar apenas um, e passar como parametro para a busca… ae nao pode ser da primeira forma mencionada?

só pra ter certeza :wink:

Valeu!!

Tentei mudar o componente de SelectOneListbox para SelectOneMenu… só para testar, e deu na mesma! =/

anybody? =/