Visualizzazione dei risultati da 1 a 4 su 4

Discussione: Java e le query

  1. #1

    Java e le query

    Dunque, avrei un piccolo problemino:

    In questa classe java

    codice:
    public static List<MacchineDTO> findBySimilarName(String nome, int codiceProfilo, String tipo, String ip, String netIp, String servizio)throws Exception{
    		Connection conn=null;
    		PreparedStatement pstmt=null;
    		List<MacchineDTO> result=new ArrayList<MacchineDTO>();
    		ResultSet res=null;
    		String ipRicerca = "%";
    		
    		if(netIp.equalsIgnoreCase("*")){
    			if(!ip.equalsIgnoreCase("*") && !ip.isEmpty()) ipRicerca = ip;
    		}else{
    			if(ip.equalsIgnoreCase("*") || ip.isEmpty()){
    				ipRicerca = netIp + "%";
    			}else{
    				if(ip.startsWith(netIp)){
    					ipRicerca = ip;
    				}else{
    					ipRicerca = netIp;
    				}
    			}
    			
    		}
    		
    		if(ProfiliDAO.findByPK(null, codiceProfilo).getIdentificativo().equalsIgnoreCase("administrator")){
    			try{
    				conn=ConnectionHelper.sorroundConnection(conn);
    				pstmt=conn.prepareStatement("SELECT macchine.* FROM macchine, (SELECT interfacce.* FROM interfacce WHERE interfacce.ip LIKE '?') AS ippp WHERE tipo = '?' AND nome LIKE '?' AND macchine.idMacchina = ippp.codiceMacchina;");
    				pstmt.clearParameters();
    				pstmt.setString(1,ipRicerca);
    				pstmt.setString(2,tipo);
    				pstmt.setString(3,"%" + nome + "%");
    				res=pstmt.executeQuery();
    				result=loadRecords(res);
    			}catch(Exception e){
    				throw e;
    			}finally{
    				pstmt.close();
    				if(res!=null)res.close();
    				conn.close();
    			}
    		}else{
    			try{
    				conn=ConnectionHelper.sorroundConnection(conn);
    				pstmt=conn.prepareStatement("SELECT macchine.* FROM macchine, (SELECT interfacce.* FROM interfacce, (SELECT * FROM permessi WHERE permessi.codiceProfilo = ?) AS ppp WHERE interfacce.ip = ppp.ip AND interfacce.ip LIKE ?) AS ippp WHERE tipo = ? AND nome LIKE ? AND macchine.idMacchina = ippp.codiceMacchina;");
    				pstmt.clearParameters();
    				pstmt.setInt(1, codiceProfilo);
    				pstmt.setString(2, ipRicerca);
    				pstmt.setString(3,tipo);
    				pstmt.setString(4,"%" + nome + "%");
    				res=pstmt.executeQuery();
    				result=loadRecords(res);
    			}catch(Exception e){
    				throw e;
    			}finally{
    				pstmt.close();
    				if(res!=null)res.close();
    				conn.close();
    			}
    		}
    		return result;
    }
    come si vede, eseguo una query, utilizzando i prepared statement. I valori che passo come parametri (la condizione è vera quindi viene eseguita la prima query) sono:

    ipRicerca = "%"
    tipo = "c"
    nome=""

    Il problema non è nella classe, perchè viene compilata e funziona tutto a dovere, ma effettuando il debug mi sono accorto che mi viene restituito un resultset vuoto, quando invece se eseguo la query a mano con gli stessi valori sul db mi viene restituito l'unico record che c'è, come dovrebbe essere.
    Da cosa può dipendere???

  2. #2
    Nella prima query prova a sostituire
    codice:
    WHERE interfacce.ip LIKE '?') AS ippp WHERE tipo = '?' AND nome LIKE '?'
    con
    codice:
    WHERE interfacce.ip LIKE %?%) AS ippp WHERE tipo = ? AND nome LIKE %?%
    Quando usi i PreparedStatement non serve che inserisci gli apici, ci pensa da solo JDBC. Per quanto riguarda le LIKE devi usare un operatore come il % per farti restituire qualcosa "come"... altrimenti così è come se stessi richiedendo un'uguaglianza.
    Windows 7 x64 + Ubuntu Linux 10.10 (Default)
    In principio era il C...
    C/C++ & C# & JavaSE/EE Developer

  3. #3
    Dunque ho risolto il prolema, ed avevi ragione per quanto riguarda il % con i like, però era errato usare %?% perchè il tutto viene sostituito con %'valore'%, invece i percentuali andavano messi nelle stringhe passate poi con setString ottenendo così '%valore%'.

    Ora funziona!!Grazie dell'aiuto!

  4. #4
    Il concetto era quello
    Di nulla!
    Windows 7 x64 + Ubuntu Linux 10.10 (Default)
    In principio era il C...
    C/C++ & C# & JavaSE/EE Developer

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.