SelectOneMenu já filtrado - Consulta do Banco de Dados

É um problema simples, mas minha pouca experiência com java não me permitiu resolver.
Tenho um selectonemmenu e gostaria de trazer a consulta de uma tabela já filtrada. Das linhas
da minha tabela “quadro_programa”, gostaria de trazer apenas aquelas que a coluna "qp_tipoatd"
seja igual a “PROMOCAO”. Agradeço as contribuições.

Segue XHTML:

<h:selectOneMenu id="inputPrograma" value="#{atendimentoController.nomeouv}" class="form-control" style="width: 50%;">
                                                                <f:selectItem itemLabel="-Selecione-" itemValue=""/>
                                                                <f:selectItems value="#{quadroProgramaController.items}" var="item" itemValue="#{item.qpPrograma}" itemLabel="#{item.qpPrograma}"/>
                                                            </h:selectOneMenu>


Segue Classe QuadroPrograma:
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pacote_jangadeiro;

import com.sun.xml.xsom.impl.RestrictionSimpleTypeImpl;
import java.io.Serializable;
import javax.faces.event.AjaxBehaviorEvent;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author vai
 */
@Entity
@Table(name = "quadro_programa")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "QuadroPrograma.findAll", query = "SELECT q FROM QuadroPrograma q")})
public class QuadroPrograma implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "qp_id")
    private Integer qpId;
    @Size(max = 45)
    @Column(name = "qp_nome_quadro")
    private String qpNomeQuadro;
    @Size(max = 30)
    @Column(name = "qp_programa")
    private String qpPrograma;
    @Size(max = 15)
    @Column(name = "qp_tipoatd")
    private String qpTipoatd;
    @Column(name = "pgr_id")
    private Integer pgrId;

    public QuadroPrograma() {
    }

    public QuadroPrograma(Integer qpId) {
        this.qpId = qpId;
    }

    public Integer getQpId() {
        return qpId;
    }

    public void setQpId(Integer qpId) {
        this.qpId = qpId;
    }

    public String getQpNomeQuadro() {
        return qpNomeQuadro;
    }

    public void setQpNomeQuadro(String qpNomeQuadro) {
        this.qpNomeQuadro = qpNomeQuadro;
    }

    public String getqpPrograma() {
        return qpPrograma;
    }

    public void setqpPrograma(String qpPrograma) {
        this.qpPrograma = qpPrograma;
    }

    public Integer getPgrId() {
        return pgrId;
    }

    public void setPgrId(Integer pgrId) {
        this.pgrId = pgrId;
    }

    public String getqpTipoatd() {
        return qpTipoatd;
    }

    public void setqpTipoatd(String qpTipoatd) {
        this.qpTipoatd = qpTipoatd;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (qpId != null ? qpId.hashCode() : 0);
        return hash;
    }

    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof QuadroPrograma)) {
            return false;
        }
        QuadroPrograma other = (QuadroPrograma) object;
        if ((this.qpId == null && other.qpId != null) || (this.qpId != null && !this.qpId.equals(other.qpId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "pacote_jangadeiro.QuadroPrograma[ qpId=" + qpId + " ]";
    }

}

Meu selectonemenu:

selectOneMenu id=“inputPrograma” value="#{atendimentoController.nomeouv}" class=“form-control” style=“width: 50%;”>
<f:selectItem itemLabel="-Selecione-" itemValue=""/
<f:selectItems value="#{quadroProgramaController.items}" var=“item” itemValue="#{item.qpPrograma}" itemLabel="#{item.qpPrograma}"/
</h:selectOneMenu

Deixa eu ver se entendi.
Você quer que tenha um selectOneMenu acima de uma table, e conforme o usuario selecionar nesta selectOneMenu sua table seja filtrada. É isto?

O que eu quero talvez seja mais simples. Tenho uma tabela chamada “quadro_programa”.
Gostaria que no meu selectonemenu tivesse apenas o resultado da coluna qp_programa,
cuja a coluna qp_tipoatd seja = “PROMOCAO”.

Exemplo da tabela “quadro_programa”:
qp_id - qp_nome_quadro - qp_programa - qp_tipoatd
1 - UM MILHÃO - MANHA DE SUCESSO - PROMOCAO
2 - SORTUDAO - FORRO DA MOLECADA - PROMOCAO
3 - AMOR VALE MIL - JANGADEIRO RELAX - SOLICITACAO

Então caso na linha da table a coluna qp_tipoatd == PROMOCAO, o selectOneMenu da coluna qp_programa aparece. Se não fica em branco ? Estou tentando entender pelo exemplo que me passou, qualquer coisa passa um fluxo .

Da imagem abaixo, gostaria que aparecesse no selectonemenu apenas:

  • MANHA DE SUCESSO
  • FORRO DA MOLECADA
    Por serem do qp_tipoatd==PROMOCAO
    Sempre vai existir linhas com qp_tipoatd==PROMOCAO, por isso não me preocuparei com
    resultados em branco.

Deu para entender?

Alguma solução simples? É possível filtrar automaticamente o carregamento da tabela com XHTML?

@blunoblaga boa tarde! Sinceramente ñ retornei por que ainda está tudo confuso. Pois teve momentos que você falou que queria que se fosse a coluna x com tal valor aparecesse somente determinados valores. Pode ser que eu esteja seguindo um raciocínio equivocado onde esta table de inicio é só p/ mostrar nada mais.

  • Esta table é editavel? Os campos apresentados serão alterados?
  • Se o campo qp_tipoatd filtra o campo qp_programa, isto é estranho p/ uma lista de registro. Não achas? Pois se o registro já existe o mesmo foi definido corretamente ou errado. (Problema na persistência dos seus registros)

Se posso resumir o que preciso, é que venha este resultado:

select qp_programa from quadro_programa where qp_tipoatd=“PROMOCAO”

Trarei este resultado dentro de um selectonemenu.

Tranquilo, mas até onde entendi… Onde fica este selectOneMenu? Tem alguma imagem dessa tela? Vc poderia enviar pra eu entender e circular os campos. Até onde entendi este suposto selectOneMenu está na row da dataTable! Certo? (Espero que eu esteja errado)

EDIT: Desculpa @blunoblaga, reli o post e entendi. Realmente vc está falando de table do banco de dados e não o componente datatable do primefaces. Cara vc está querendo reaproveitar o NamedQuery neh?
Sugiro fazer um metodo/HQL especificamente p/ isto. Pois hoje vc pode estar filtrando pouquíssimos registros e não faz diferença separar isto na memória. Mas com o tempo esta tabela irá crescer e vc irá trazer registros desnecessários e ainda irá “separa-los”.
Traga-os já pronto um tipo buscarQuadroProgramaApenasEmPromocao, cada funcionalidade no seu lugar .

1 curtida

Na minha pouca experiência em JAVA, estou tentando fazer um método como o de baixo:

public String getQpPrograma() {
if (“PROMOCAO”.equals(qpTipoatd)) {
return qpPrograma;
} return null;
}

mas a opção que não deveria aparecer no selectonemenu, continua aparecendo um valor de ID.
É ai que estou preso.

Não faça esse tipo de comparação, assim você trava PROMOCAO no código (hard coded), e isso não é legal, se depois você quiser filtrar por SOLICITACAO por exemplo, vai ter que criar outro if, e mais outro…

O que o @RaulCrash indicou é isso

1 curtida

Vou criar um método para trazer o resultado já com esse filtro. Esse código que eu postei foi apenas um exemplo de tentativa minha para trazer o resultado já com o filtro. Não tenho experiência com JAVA, mas acredito que qualquer pessoa que saiba o básico consegue montar o método em questão.

1 curtida