Sembra che tu stia passando l'argomento concatenandoli direttamente nella stringa. Questa è una pessima idea, poiché può portare a iniezioni SQL. usa PreparedStatement
s
con il ?
segnaposto per passare parametri, non passarli mai direttamente concatenandoli direttamente nella stringa di query (inoltre, avresti bisogno del '
delimitatori intorno).
Potresti avere qualcosa come:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=?")
stmt.setDate(1, new java.sql.Date(cin.getTime()));
// ? parameters are indexed from 1
ResultSet results = stmt.executeQuery();
In alternativa, la conversione interna della data di PostgreSQL è generalmente abbastanza buona e flessibile. Puoi eseguire il cast del parametro string a una data con PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Questo è flessibile, ma potrebbe non portare al risultato esatto di cui hai bisogno a seconda del formato della data (puoi controllare il manuale di PostgreSQL per i dettagli sui formati di conversione della data). Tuttavia, il formato di input che stai utilizzando dovrebbe funzionare correttamente (prova SELECT CAST('2012-05-01' AS DATE)
direttamente in PostgreSQL, ad esempio, questo restituirà una data PostgreSQL corretta.)
Nota che quando usi new java.sql.Date(cin.getTime())
, è probabile che si verifichino problemi di fuso orario. Potresti usare java.sql.Date.valueOf(...)
anche.
Per chiarire, a seguito della tua modifica:
Questo non funzionerà, poiché le date sarebbero parte della sintassi SQL stessa, non stringhe o date:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Dovresti almeno usare '
virgolette: . Qui, in una certa misura, potresti aspettarti che i parametri siano formattati correttamente, ma non farlo. Inoltre, dovrebbe comunque eseguire il cast della stringa utilizzando "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
o '...'::DATE
.
Il modo più semplice sarebbe sicuramente:
String searchQuery = "SELECT * FROM Rooms r where r.id not in (select SOMETHING from search(CAST(? AS DATE), CAST(? AS DATE)))";
PreparedStatement ps = conn.prepareStatement(searchQuery);
ps.setString(1, cinDate);
ps.setString(2, coutDate);
(Come sottolineato in un commento a_horse_with_no_name, la query generale non funzionerebbe comunque a causa della tua selezione interiore.)