Det lyder som om du sender argumentet ved at sammenkæde dem direkte i strengen. Dette er en meget dårlig idé, da det kan føre til SQL-injektioner. Brug altid PreparedStatement
s
med ?
pladsholdere til at videregive parametre, send dem aldrig direkte ved at sammenkæde dem direkte i forespørgselsstrengen (mere så skal du bruge '
afgrænsninger omkring).
Du kunne have noget som:
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();
Alternativt er PostgreSQL intern datokonvertering normalt ret god og fleksibel. Du kan caste strengparameteren til en dato med PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Dette er fleksibelt, men fører muligvis ikke til det nøjagtige resultat, du har brug for, afhængigt af datoformatet (du kan tjekke PostgreSQL-manualen for detaljer om datokonverteringsformater). Det inputformat, du bruger, burde dog fungere fint (Prøv SELECT CAST('2012-05-01' AS DATE)
direkte i PostgreSQL, for eksempel, vil dette returnere en korrekt PostgreSQL-dato.)
Bemærk, at når du bruger new java.sql.Date(cin.getTime())
, vil du sandsynligvis løbe ind i tidszoneproblemer. Du kan bruge java.sql.Date.valueOf(...)
også.
For at præcisere, følg din redigering:
Dette vil ikke virke, da datoerne ville være en del af selve SQL-syntaksen, ikke strenge eller datoer:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Du skal i det mindste bruge '
citater: . Her kunne du til en vis grad forvente, at parametrene er formateret korrekt, men lad være med at gøre det. Derudover ville stadig skulle caste strengen ved hjælp af "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
eller '...'::DATE
.
Den enkleste måde ville helt sikkert være:
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);
(Som a_horse_with_no_name påpegede i en kommentar, ville den generelle forespørgsel alligevel ikke fungere på grund af dit indre valg.)