Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    6

    [JAVA] Query con variabile

    Buongiorno a tutti.
    Sto cercando di scrivere un programma che mi confronti tramite un database quali prodotti scadranno domani.
    Credo di avere impostato correttamente la variabile "Domani" tramite:

    codice:
      GregorianCalendar gc = new GregorianCalendar();
          SimpleDateFormat data = new SimpleDateFormat("yyyy-MM-dd");
          gc.add(GregorianCalendar.DAY_OF_MONTH, 1);
          String Domani =data.format(gc.getTime());

    Il problema è che eseguendo la query:

    codice:
    String query = "SELECT * FROM products WHERE Scadenza LIKE '%Domani%'";

    Essa non produce nessun risultato malgrado ci siano nel data base dei prodotti da identificare.
    Credo che il problema sia nella sintassi della variabile, ma le ho provate un po' tutte, senza risultati . Qualcuno sa aiutarmi?
    Ultima modifica di LeleFT; 21-07-2015 a 15:28 Motivo: Aggiunti i tag CODE

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Dipende da cosa usi: JDBC? Allora hai due possibilità:

    1) Usare le Statement semplici e usare la concatenazione per creare le query SQL (solo per sapere che esiste: non usarla)
    2) Usare le PreparedStatement e i parametri.

    L'uso delle PreparedStatement ti consente di non avere problemi con quoting e/o conversioni/formattazioni dei dati.

    Se, ad esempio, il campo Scadenza è di tipo DATE nel db:

    codice:
    GregorianCalendar gc = new GregorianCalendar();    // Oggi
    gc.add(Calendar.DATE, 1);   // Domani
    java.sql.Date domani = new java.sql.Date( gc.getTime() );
    
    String sql = "SELECT * FROM products WHERE Scadenza = ?";   // Il ? è un segnaposto per un parametro
    
    PreparedStatement pstmt = con.prepareStatement( sql );
    pstmt.setDate(1, domani);   // I parametri sono numerati a partire da 1, dal primo ? che viene trovato nella stringa SQL
    
    ResultSet rs = pstmt.executeQuery();
    ...

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Baratta Visualizza il messaggio
    codice:
    String query = "SELECT * FROM products WHERE Scadenza LIKE '%Domani%'";
    No, innanzitutto un "LIKE" con le date è assolutamente senza senso. Poi comunque a livello Java hai una variabile Domani ma questa non si inietta "per magia" in una stringa letterale unica come quella che hai fatto! Insomma, non ha proprio senso.

    E purtroppo lavorare con le date su database non è sempre così facile. Quale DBMS usi? Come è tipizzato il campo Scadenza? Ha solo la nozione di data o anche sull'ora?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2015
    Messaggi
    6
    Vi ringrazio entrambi ma sono riuscito a risolvere utilizzando la concatenazione di stringhe. Grazie ancora per il vostro tempo

    PS. andbin posso chiederti cosa useresti invece che il LIKE? Dici che è meglio un semplice = ?

  5. #5
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Preparare le query tramite concatenazione di stringhe è un ottimo modo per rendere un'applicazione a rischio di sql injection. Se c'è un modo standard, sicuro e altrettanto semplice per fare una certa cosa perché ostinarsi con una soluzione obsoleta e 100% a rischio? Magari il tuo è un semplice esercizietto del menga ma una cosa del genere in ambiente lavorativo è la peggio cosa che si possa fare, in particolare se i parametri della query arrivano dall'esterno (magari non è il tuo caso).
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Quote Originariamente inviata da Alex'87 Visualizza il messaggio
    Preparare le query tramite concatenazione di stringhe è un ottimo modo per rendere un'applicazione a rischio di sql injection. Se c'è un modo standard, sicuro e altrettanto semplice per fare una certa cosa perché ostinarsi con una soluzione obsoleta e 100% a rischio? Magari il tuo è un semplice esercizietto del menga ma una cosa del genere in ambiente lavorativo è la peggio cosa che si possa fare, in particolare se i parametri della query arrivano dall'esterno (magari non è il tuo caso).
    Quoto e aggiungo: in particolare quando i parametri sono delle date, visto che ciascun DBMS utilizza un modo diverso (a volte proprio "tutto suo") di accettare la data in formato stringa.
    Usare il LIKE con le date, poi, come ha detto andbin è assolutamente privo di senso, visto che l'operatore LIKE serve a ricercare un determinato pattern all'interno di un campo... quale sia il senso di usare un "pattern" con le date rimane un mistero ai più: se c'è un campo data, le ricerche sensate sono:

    1) Uguaglianza di una data con un determinato valore
    2) Cercare date maggiori (o uguali) di un determinato valore
    3) Cercare date minori (o uguali) di un determinato valore
    4) Cercare date in un intervallo di valori

    Che senso ha cercare date "che rispettino un determinato pattern lessicografico" (es: cercare tutte le date che contengono un "20")?


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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 © 2025 vBulletin Solutions, Inc. All rights reserved.