Ajuda montar pesquisa com vários Jtextfield e JCombobox

Boa Tarde, Pessoal

Gostaria de uma ajuda de qual melhor forma para se montar uma “pesquisa ou filtro” de dados já cadastrados no banco de dados.

Possuo um Jframe chamado JConsulta o qual possui 5 campos, sendo eles do tipo: 2 JFormattedTextField, 2 JTextField e 1 JComboBox, e um botão pesquisar.

A lógica é a seguinte ao clicar no botão pesquisar ele irá chamar uma classe ConsultaDAO onde possuo métodos que me retornam um list.

Então dependendo da quantidade de campos que eu preencher no JConsulta a consulta ficará mais refinada.

Pensei em verificar cada campo do JConsulta com vários if, mas dessa forma terei que fazer muitos ifs. Vocês possuem uma solução mais simples.

Ah… eu possuo duas classes uma VO que possui os 5 campos (Consulta) e a DAO (ConsultaDAO).

SEGUE ABAIXO:

[code]

public class ConsultaDao {

public List lerTodos() {



	String sql = "SELECT id, nomeusuario, data, posicao, fase, tipomanutencao, "
                    +"tipo FROM  pk6a a INNER JOIN ensaio e ON a.idEnsaio = e.id "
                    +"INNER JOIN equipamento q ON e.idequipamento = q.id INNER JOIN "
                    +"usuario u ON e.idLogin = u.login";
	Connection conn = null;
	PreparedStatement stmt = null;
	ResultSet rs = null;
	List Consulta = new ArrayList();

	try {
		conn = ConectionManager.getConexao();
		stmt = conn.prepareStatement(sql);
		rs = stmt.executeQuery();

		while (rs.next()) {

                            int id = rs.getInt("id");
			String nomeUsuario = rs.getString("nomeUsuario");
                            String data = rs.getString("data");
			String fase = rs.getString("fase");
			int posicao = rs.getInt("posicao");
                            String tipoManutencao = rs.getString("tipoManutencao");
                            String tipoEquipamento = rs.getString("tipo");

			Consulta.add (new Consulta(id, nomeUsuario, data, fase, posicao, tipoManutencao, tipoEquipamento));
		}
	} catch (SQLException e) {
		System.out.println("Erro ao executar select lerTodos");
		e.printStackTrace();
	} finally {
		ConectionManager.close(conn, stmt, rs);
	}

	return Consulta;
}

}[/code]


public class Consulta {

    private int id;
    private String nomeUsuario;
    private String data;
    private String fase;
    private int posicao;
    private String tipoManutencao;
    private String tipoEquipamento;
    
    
    

    public Consulta(int id, String nomeUsuario, String data, String fase, int posicao, String tipoManutencao,
            String tipoEquipamento) {
        this.id = id;
        this.nomeUsuario = nomeUsuario;
        this.data = data;
        this.fase = fase;
        this.posicao = posicao;
        this.tipoManutencao = tipoManutencao;
        this.tipoEquipamento = tipoEquipamento;
    }



    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
    
    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public String getFase() {
        return fase;
    }

    public void setFase(String fase) {
        this.fase = fase;
    }

    public String getNomeUsuario() {
        return nomeUsuario;
    }

    public void setNomeUsuario(String nomeUsuario) {
        this.nomeUsuario = nomeUsuario;
    }

    public int getPosicao() {
        return posicao;
    }

    public void setPosicao(int posicao) {
        this.posicao = posicao;
    }

    public String getTipoManutencao() {
        return tipoManutencao;
    }

    public void setTipoManutencao(String tipoManutencao) {
        this.tipoManutencao = tipoManutencao;
    }

    public String getTipoEquipamento() {
        return tipoEquipamento;
    }

    public void setTipoEquipamento(String tipoEquipamento) {
        this.tipoEquipamento = tipoEquipamento;
    }

    

    @Override
    public String toString() {
        return "Consulta{" + "nomeUsuario=" + nomeUsuario + "data=" + data + "fase=" + fase + "posicao=" + posicao + "tipoManutencao=" + tipoManutencao + '}';
    }




    


}

 public JconsultaPk() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        usuarioTf = new javax.swing.JTextField();
        pkCb = new javax.swing.JComboBox();
        jLabel5 = new javax.swing.JLabel();
        equipamentoTf = new javax.swing.JTextField();
        dataInicialFtf = new javax.swing.JFormattedTextField();
        dataFinalfTf = new javax.swing.JFormattedTextField();
        jPanel4 = new javax.swing.JPanel();
        jPanel2 = new javax.swing.JPanel();
        jButton2 = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jPanel1.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Consulta por tipo de Pk", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Arial", 0, 14))); // NOI18N

        jLabel1.setText("Data inicial:");

        jLabel2.setText("Data final:");

        jLabel3.setText("Usuário:");

        jLabel4.setText("Equipamento:");

        pkCb.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "pk6a", "pk6b", "pk6c", "pk6d" }));

        jLabel5.setText("Tipo de Pk:");

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel4)
                            .addComponent(jLabel5))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addComponent(pkCb, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(equipamentoTf, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 130, Short.MAX_VALUE)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jLabel3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                            .addComponent(usuarioTf)
                            .addComponent(dataInicialFtf, javax.swing.GroupLayout.DEFAULT_SIZE, 103, Short.MAX_VALUE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 48, Short.MAX_VALUE)
                        .addComponent(jLabel2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(dataFinalfTf, javax.swing.GroupLayout.PREFERRED_SIZE, 103, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(4, 4, 4)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2)
                    .addComponent(dataInicialFtf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(dataFinalfTf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(usuarioTf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel4)
                    .addComponent(equipamentoTf, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel5)
                    .addComponent(pkCb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 364, Short.MAX_VALUE)
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 0, Short.MAX_VALUE)
        );

        jPanel2.setBackground(new java.awt.Color(231, 233, 35));
        jPanel2.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(233, 160, 35), 2));

        jButton2.setText("Retornar");

        jButton1.setText("Consultar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 104, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 43, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addGap(92, 92, 92))
                    .addComponent(jPanel2, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jPanel1, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(83, 83, 83)
                .addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-482)/2, (screenSize.height-313)/2, 482, 313);
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // TODO add your handling code here:

        if (tipoPk.isEmpty())
        {
            consultaTipoPk();
        }


    }                                        

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new JconsultaPk().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JFormattedTextField dataFinalfTf;
    private javax.swing.JFormattedTextField dataInicialFtf;
    private javax.swing.JTextField equipamentoTf;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JComboBox pkCb;
    private javax.swing.JTextField usuarioTf;
    // End of variables declaration

eu criaria métodos sobrecarregados.

então vou fazer isso sim no meu ConsultaDAO. Só não sei como fazer o filtro antes de chegar no consultaDAO.

A solução seria mais ou menos assim:

String valor1 = JtextField.gettext();

if ( valor1.isEmpety())
{
…} else if (valor1.isEmpety && valor2.isEmpety) {…}

Ou seja tenho vários campos para verificar, gostaria de algo mais simples e rápido…

eh colega…acho que não vai ter como fugir não…

Veja essa idéia: no método initComponents você pode criar um List e inserir nele esses componentes. Daí, no momento de realizar a consulta você só dá um for each nesse list, vai fazendo os casts necessários e pegando o conteúdo de cada um. Então é só montar uma String concatenando esses valores com os trechos necessários para completar sua instrução SQL.

Honestamente não sei se entendi bem a questão mas vamos lá:

Você poderia associar os nomes do componentes (JTextField e etc…) com o nome das colunas da consulta. Após executar a consultada vc poderia acessar a lista de componentes do painel e obter o componente apropriado através do nome da coluna x nome do componente e aplicar o conteúdo.

flws

Boa tarde a todos.

Como disse o nosso amigo Yhhik, não há como fugir dos testes dos “IFs”, contudo para amenizar o seu sofrimento, eu construi um método chamado getWhere() que retorna uma String caso algum campo esteja populado, eu populo um objeto chamado Bean (ServidorBean) com os JComboBox, JTextFields e etc e depois passo este bean para o DAO como referência, desta forma:


  .......
  .......

  public void select(ServidorBean bean) {
       ...
       String sql = "SELECT * FROM SERVIDOR " + getWhere(bean);
       ....
       // Fazer conexão com o banco com a String sql.
  }

  public String getWhere(ServidorBean filtro){
        String where = "";
        if (filtro!=null){
            where += ((filtro.getUnidade().getId()!=0)?" AND FK_UNIDADE = "+filtro.getUnidade().getId():"");
            where += ((filtro.getSituacaoFuncional().getId()!=0)?" AND FK_SITUACAO_FUNCIONAL = "+filtro.getSituacaoFuncional().getId():"");
            where += ((filtro.getCargo().getId()!=0)?" AND FK_CARGO = "+filtro.getCargo().getId():"");
            where += ((filtro.getFuncao().getId()!=0)?" AND FK_FUNCAO = "+filtro.getFuncao().getId():"");
            where += ((filtro.getNome()!=null)?" AND NOME_SERV ILIKE '%"+filtro.getNome().replaceAll("'", "''")+"%'":"");
            where += ((filtro.getMatricula()!=null)?" AND MATRICULA_SERV ILIKE '"+filtro.getMatricula().replaceAll("'", "''")+"%'":"");
        }
        return where;
    }

Esta é uma forma abreviada de se usar os IFs, pelo menos ameniza um pouco seu sofrimento de escrever tanto código.

Um abraço

muito obrigado pessoal mas vou fazer os if mesmo…!!!