Problema concatenazione stringhe query sql jdbc

di il
14 risposte

Problema concatenazione stringhe query sql jdbc

Questa è il valore della console:
update CANDIDATO set NOME = ?
update CANDIDATO set NOME = ? , COGNOME = ?
update CANDIDATO set NOME = ? , COGNOME = ?, LUOGO_DI_NASCITA = ?
update CANDIDATO set NOME = ? , COGNOME = ?, LUOGO_DI_NASCITA = ?, RESIDENZA = ?
update CANDIDATO set NOME = ? , COGNOME = ?, LUOGO_DI_NASCITA = ?, RESIDENZA = ?, ETA = ?
update CANDIDATO set NOME = ? , COGNOME = ?, LUOGO_DI_NASCITA = ?, RESIDENZA = ?, ETA = ?, DATA = ?
update CANDIDATO set NOME = ? , COGNOME = ?, LUOGO_DI_NASCITA = ?, RESIDENZA = ?, ETA = ?, DATA = ? where ID_CANDIDATO = ?

il problema sta quando il nome == null e luogo di nascita == null la virgola non ci deve stare.

List<Candidato> cList3 = icandidatoDao.aggiornaCandidato(null, "cognome", null, "residenza", 17,
				miaData, 3);
questo è il codice di concatenazione stringhe:

if (nome != null && !"".equals(nome.trim())) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addNome = " NOME = ? ";
				queryUpdate += addNome; // concatena e aggiorna
			} 

			System.out.println(queryUpdate);

			if (cognome != null && !"".equals(cognome.trim())) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addCognome = " COGNOME = ?";
				queryUpdate += virgola + addCognome; // concatena e aggiorna
			} 

			System.out.println(queryUpdate);

			if (luogoDiNascita != null && !"".equals(luogoDiNascita.trim())) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addLuogoDiNascita = " LUOGO_DI_NASCITA = ?";
				queryUpdate += virgola + addLuogoDiNascita;
			} 

			System.out.println(queryUpdate);

			if (residenza != null && !"".equals(residenza.trim())) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addResidenza = " RESIDENZA = ?";
				queryUpdate += virgola + addResidenza;
			}

			System.out.println(queryUpdate);

			if (eta != 0) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addEta = " ETA = ?";
				queryUpdate += virgola + addEta;
			}

			System.out.println(queryUpdate);

			if (date != null) {
				verifica = true;

				// fai l'aggiornamento della query precedente
				addData = " DATA = ?";
				queryUpdate += virgola + addData;
			}

			System.out.println(queryUpdate);

			if (id_candidato != 0) {
				verifica = true;
				addIdcandidato = " where ID_CANDIDATO = ?";
				queryUpdate += addIdcandidato;
			}

			System.out.println(queryUpdate);

ho provato con altri tentativi ma non ci riesco

14 Risposte

  • Re: Problema concatenazione stringhe query sql jdbc

    String queryUpdate = "update CANDIDATO set ";
  • Re: Problema concatenazione stringhe query sql jdbc

    Risolto, la concatenazione di stringhe.

    Un altro problema sta nel fatto che quando avvio la query di quelli che sono True
    
    pStatement = dbConnection.prepareStatement(queryUpdate);
    			pStatement.setInt(1, id_candidato);
    			pStatement.setString(2, nome);
    			pStatement.setString(3, cognome);
    			pStatement.setString(4, luogoDiNascita);
    			pStatement.setString(5, residenza);
    			pStatement.setInt(6, eta);
    			pStatement.setDate(7, date);
    			pStatement.executeUpdate();
    
    pStatement deve capire a quali devi eseguire, se ad esempio cognome è null, residenza è null.
    come bisogna fare che deve eseguire solo id,nome,luogodinascita,eta,data????
  • Re: Problema concatenazione stringhe query sql jdbc

    robot ha scritto:


    se ad esempio cognome è null, residenza è null.
    come bisogna fare che deve eseguire solo id,nome,luogodinascita,eta,data????
    Fai un test come hai fatto per la composizione del SQL. Con un piccolo inghippo: l'indice non può essere ovviamente fisso, devi usare una variabile di indice che incrementi solo se "usi" un dato.
  • Re: Problema concatenazione stringhe query sql jdbc

    Per ogni if ho dato un indice da 0 fino a 7.
    
    
    			if (nome != null && !"".equals(nome.trim())) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addNome = " NOME = ? ";
    					queryUpdate += addNome; // concatena e aggiorna
    				} else {
    					addNome = " NOME = ? ";
    					queryUpdate += addNome; // concatena e aggiorna
    				}
    				verifica = true;
    				condizione = 1;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (cognome != null && !"".equals(cognome.trim())) {
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addCognome = " COGNOME = ?";
    					queryUpdate += virgola + addCognome; // concatena e aggiorna
    				} else {
    					verifica = false;
    					addCognome = " COGNOME = ?";
    					queryUpdate += addCognome; // concatena e aggiorna
    				}
    				verifica = true;
    				condizione = 2;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (luogoDiNascita != null && !"".equals(luogoDiNascita.trim())) {
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addLuogoDiNascita = " LUOGO_DI_NASCITA = ?";
    					queryUpdate += virgola + addLuogoDiNascita;
    				} else {
    					addLuogoDiNascita = " LUOGO_DI_NASCITA = ?";
    					queryUpdate += addLuogoDiNascita;
    				}
    				verifica = true;
    				condizione = 3;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (residenza != null && !"".equals(residenza.trim())) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addResidenza = " RESIDENZA = ?";
    					queryUpdate += virgola + addResidenza;
    				} else {
    					addResidenza = " RESIDENZA = ?";
    					queryUpdate += addResidenza;
    				}
    				verifica = true;
    				condizione = 4;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (eta != 0) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addEta = " ETA = ?";
    					queryUpdate += virgola + addEta;
    				} else {
    					addEta = " ETA = ?";
    					queryUpdate += addEta;
    				}
    				verifica = true;
    				condizione = 5;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (date != null) {
    
    				if (verifica) { // verifica è impostato a true
    					// fai l'aggiornamento della query precedente
    					addData = " DATA = ?";
    					queryUpdate += virgola + addData;
    				} else { // verifica è impostato a false
    					addData = " DATA = ?";
    					queryUpdate += addData;
    				}
    				verifica = true;
    				condizione = 6;
    			}
    
    			System.out.println(queryUpdate);
    
    			if (id_candidato != 0) {
    				addIdcandidato = " where ID_CANDIDATO = ?";
    				queryUpdate += addIdcandidato;
    				verifica = true;
    				condizione = 7;
    			}
    
    

    se faccio in questo modo non funziona:
    
    // // Avvia l'aggiornamento in sql oracle
    			if (condizione != 0) {
    				
    				//nome,cognome,id
    				if (condizione == 1 && condizione == 2 && condizione == 7) {
    					pStatement = dbConnection.prepareStatement(queryUpdate);
    					pStatement.setString(condizione, nome);
    					pStatement.setString(condizione, cognome);
    					pStatement.setInt(condizione, id_candidato);
    					pStatement.executeUpdate();
    				}
    
    
  • Re: Problema concatenazione stringhe query sql jdbc

    Che cosa intendi dire???
    come devo formulare il codice?
  • Re: Problema concatenazione stringhe query sql jdbc

    
    // // Avvia l'aggiornamento in sql oracle
    			if (id_candidato != 0) {
    
    				// nome,cognome,id
    				if (nome != null && cognome != null && id_candidato != 0) {
    					pStatement = dbConnection.prepareStatement(queryUpdate);
    					pStatement.setString(condizione, nome);
    					pStatement.setString(condizione, cognome);
    					pStatement.setInt(condizione, id_candidato);
    					pStatement.executeUpdate();
    				}
    
    			}
    
    
  • Re: Problema concatenazione stringhe query sql jdbc

    Anche in questo modo non funziona
  • Re: Problema concatenazione stringhe query sql jdbc

    Ma non scherziamo ...
    boolean usaNome = nome != null && !nome.trim().equals("");
    boolean usaCognome = cognome != null && !cognome.trim().equals("");
    // ....
    
    ArrayList<String> values = new ArrayList<String>();
    
    if (usaNome) {
        values.add("NOME = ?");
    }
    
    if (usaCognome) {
        values.add("COGNOME = ?");
    }
    
    // ....
    
    if (values.size() > 0) {
        StringBuilder query = new StringBuilder("update CANDIDATO set ");
    
        for (int i = 0; i < values.size(); i++) {
            if (i > 0) {
                query.append(", ");
            }
    
            query.append(values.get(i));
        }
    
        query.append(" where ID_CANDIDATO = ?");
    
        pStatement = dbConnection.prepareStatement(query.toString());
        int indice = 1;
    
        if (usaNome) {
            pStatement.setString(indice++, nome);
        }
    
        if (usaCognome) {
            pStatement.setString(indice++, cognome);
        }
    
        // ....
    
        pStatement.executeUpdate();
    }

    E se puoi usare ad esempio Java 8 (che ha il StringJoiner) diventa una cosa ancora più banale.
  • Re: Problema concatenazione stringhe query sql jdbc

    Da Java 8 con StringJoiner:
    boolean usaNome = nome != null && !nome.trim().equals("");
    boolean usaCognome = cognome != null && !cognome.trim().equals("");
    
    StringJoiner values = new StringJoiner(", ");
    
    if (usaNome) {
        values.add("NOME = ?");
    }
    
    if (usaCognome) {
        values.add("COGNOME = ?");
    }
    
    if (values.length() > 0) {
        String query = "update CANDIDATO set " + values + " where ID_CANDIDATO = ?";
    
        pStatement = dbConnection.prepareStatement(query);
        int indice = 1;
    
        if (usaNome) {
            pStatement.setString(indice++, nome);
        }
    
        if (usaCognome) {
            pStatement.setString(indice++, cognome);
        }
    
        // ....
    }
  • Re: Problema concatenazione stringhe query sql jdbc

    Grazie, non lo sapevo questa nuova funzionalità in java 8, ti ringrazio lo stesso.

    Ma in java 7 come diventerebbe?
  • Re: Problema concatenazione stringhe query sql jdbc

    Ho fatto più o meno è simile.Grazie MIlle
  • Re: Problema concatenazione stringhe query sql jdbc

    Ciao, ti faccio vedere il codice ho fatto più o meno simile al tuo:
    
    public List<Candidato> aggiornaCandidato(String nome, String cognome, String luogoDiNascita, String residenza,
    			int eta, java.sql.Date date, int id_candidato) {
    
    		List<Candidato> nlist = new ArrayList<>();
    		boolean verifica = false;
    		String queryUpdate = "update CANDIDATO set";
    		String addNome = null, addCognome = null, addLuogoDiNascita = null, addResidenza = null, addEta = null,
    				addData = null, addIdcandidato = "where ID_CANDIDATO = ?", virgola = ",";
    
    		Connection dbConnection = null;
    		Statement statement = null;
    		ResultSet rSet = null;
    		PreparedStatement pStatement = null;
    		int condizione = 0;
    
    		try {
    			dbConnection = Database.getConnection();
    			statement = dbConnection.createStatement();
    
    			if (nome != null && !"".equals(nome.trim())) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addNome = " NOME = ? ";
    					queryUpdate += addNome; // concatena e aggiorna
    				} else {
    					addNome = " NOME = ? ";
    					queryUpdate += addNome; // concatena e aggiorna
    				}
    				verifica = true;
    				//condizione = 1;
    			}
    
    			if (cognome != null && !"".equals(cognome.trim())) {
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addCognome = " COGNOME = ?";
    					queryUpdate += virgola + addCognome; // concatena e aggiorna
    				} else {
    					verifica = false;
    					addCognome = " COGNOME = ?";
    					queryUpdate += addCognome; // concatena e aggiorna
    				}
    				verifica = true;
    				//condizione = 2;
    			}
    
    			if (luogoDiNascita != null && !"".equals(luogoDiNascita.trim())) {
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addLuogoDiNascita = " LUOGO_DI_NASCITA = ?";
    					queryUpdate += virgola + addLuogoDiNascita;
    				} else {
    					addLuogoDiNascita = " LUOGO_DI_NASCITA = ?";
    					queryUpdate += addLuogoDiNascita;
    				}
    				verifica = true;
    				//condizione = 3;
    			}
    
    			if (residenza != null && !"".equals(residenza.trim())) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addResidenza = " RESIDENZA = ?";
    					queryUpdate += virgola + addResidenza;
    				} else {
    					addResidenza = " RESIDENZA = ?";
    					queryUpdate += addResidenza;
    				}
    				verifica = true;
    				//condizione = 4;
    			}
    
    			if (eta != 0) {
    
    				if (verifica) {
    					// fai l'aggiornamento della query precedente
    					addEta = " ETA = ?";
    					queryUpdate += virgola + addEta;
    				} else {
    					addEta = " ETA = ?";
    					queryUpdate += addEta;
    				}
    				verifica = true;
    				//condizione = 5;
    			}
    
    			if (date != null) {
    
    				if (verifica) { // verifica è impostato a true
    					// fai l'aggiornamento della query precedente
    					addData = " DATA = ?";
    					queryUpdate += virgola + addData;
    				} else { // verifica è impostato a false
    					addData = " DATA = ?";
    					queryUpdate += addData;
    				}
    				verifica = true;
    				//condizione = 6;
    			}
    
    			if (id_candidato != 0) {
    				addIdcandidato = " where ID_CANDIDATO = ?";
    				queryUpdate += addIdcandidato;
    				verifica = true;
    				//condizione = 7;
    			}
    
    			System.out.println("Update: " + queryUpdate);
    
    			// Avvia l'aggiornamento in sql oracle
    			pStatement = dbConnection.prepareStatement(queryUpdate);
    
    			// aggiorna il nome
    			if (nome != null && !nome.trim().equals("")) {
    				pStatement.setString(condizione++, nome);
    			}
    
    			// aggiorna il cognome
    			if (cognome != null && !cognome.trim().equals("")) {
    				pStatement.setString(condizione++, cognome);
    			}
    
    			// aggiorna luogo di nascita
    			if (luogoDiNascita != null && !luogoDiNascita.trim().equals("")) {
    				pStatement.setString(condizione++, luogoDiNascita);
    			}
    
    			// aggiorna la residenza
    			if (residenza != null && !residenza.trim().equals("")) {
    				pStatement.setString(condizione++, residenza);
    			}
    
    			// aggiorna l'eta
    			if (eta != 0) {
    				pStatement.setInt(condizione++, eta);
    			}
    
    			// aggiorna la data
    			if (date != null) {
    				pStatement.setDate(condizione++, date);
    			}
    
    			// aggiorna id_candidato
    			if (id_candidato != 0) {
    				pStatement.setInt(condizione++, id_candidato);
    			}
    
    			pStatement.executeUpdate();
    
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (dbConnection != null && statement != null && rSet != null && pStatement != null) {
    					dbConnection.close();
    					statement.close();
    					rSet.close();
    					pStatement.close();
    				}
    			} catch (Exception e2) {
    				e2.printStackTrace();
    			}
    		}
    		return nlist;
    	}
    

    Mi da questo errore nella colonna:
    ***FACTORY CANDIDATO***
    Aggiorna il candidato
    Ti sei connesso! --> oracle.jdbc.driver.T4CConnection@573fd745
    Update: update CANDIDATO set NOME = ? where ID_CANDIDATO = ?
    java.sql.SQLException: Indice di colonna non valido
    at oracle.jdbc.driver.OraclePreparedStatement.setStringInternal(OraclePreparedStatement.java:5386)
    at oracle.jdbc.driver.OraclePreparedStatement.setString(OraclePreparedStatement.java:5374)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.setString(OraclePreparedStatementWrapper.java:282)
    at it.sync.dao.jdbc.impl.CandidatoJdbcImpl.aggiornaCandidato(CandidatoJdbcImpl.java:356)
    at it.sync.main.TestFactory.main(TestFactory.java:52)
  • Re: Problema concatenazione stringhe query sql jdbc

    robot ha scritto:


    java.sql.SQLException: Indice di colonna non valido
    A parte il fatto che hai sbagliato perché gli indici partono da 1, non da 0. Comunque il tuo codice è molto più prolisso e fumoso di quello che ti ho mostrato io (per Java 8 o no che sia)
  • Re: Problema concatenazione stringhe query sql jdbc

    Lo so, perciò il tuo codice è pulito ed apprezzabile ed è molto comprensibile
Devi accedere o registrarti per scrivere nel forum
14 risposte