Het klinkt alsof je het argument doorgeeft door ze rechtstreeks in de string samen te voegen. Dit is een heel slecht idee, omdat het kan leiden tot SQL-injecties. Altijd gebruik PreparedStatement
s
met de ?
plaatsaanduidingen om parameters door te geven, geef ze nooit rechtstreeks door ze rechtstreeks in de queryreeks samen te voegen (meer nog, u hebt de '
nodig scheidingstekens rond).
Je zou zoiets kunnen hebben als:
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();
Als alternatief is de interne datumconversie van PostgreSQL meestal redelijk goed en flexibel. Je zou de stringparameter naar een datum kunnen casten met PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Dit is flexibel, maar leidt mogelijk niet tot het exacte resultaat dat u nodig hebt, afhankelijk van het datumformaat (u kunt de PostgreSQL-handleiding raadplegen voor details over datumconversieformaten). Het invoerformaat dat u gebruikt, zou echter prima moeten werken (Probeer SELECT CAST('2012-05-01' AS DATE)
rechtstreeks in PostgreSQL, bijvoorbeeld, dit geeft een correcte PostgreSQL-datum terug.)
Merk op dat bij gebruik van new java.sql.Date(cin.getTime())
, loop je waarschijnlijk tegen problemen met de tijdzone aan. Je zou java.sql.Date.valueOf(...)
. kunnen gebruiken ook.
Ter verduidelijking, na uw bewerking:
Dit zal niet werken, omdat de datums deel zouden uitmaken van de SQL-syntaxis zelf, niet strings of datums:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
U moet op zijn minst '
. gebruiken quotes: . Hier zou je tot op zekere hoogte kunnen verwachten dat de parameters correct zijn geformatteerd, maar doe het niet. Bovendien zou de string nog steeds moeten worden gecast met "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
of '...'::DATE
.
De eenvoudigste manier zou zeker zijn:
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);
(Zoals a_horse_with_no_name in een opmerking opmerkte, zou de algemene vraag toch niet werken vanwege je innerlijke selectiviteit.)