Es hört sich so an, als würden Sie das Argument übergeben, indem Sie es direkt in die Zeichenfolge verketten. Dies ist eine sehr schlechte Idee, da es zu SQL-Injections führen kann. Verwenden Sie immer PreparedStatement
s
mit dem ?
Platzhalter zum Übergeben von Parametern, übergeben Sie sie niemals direkt, indem Sie sie direkt in die Abfragezeichenfolge verketten (mehr noch, Sie benötigen den '
Trennzeichen herum).
Sie könnten so etwas haben wie:
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();
Alternativ ist die interne PostgreSQL-Datumsumwandlung normalerweise ziemlich gut und flexibel. Sie könnten den String-Parameter mit PostgreSQL in ein Datum umwandeln:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Dies ist flexibel, führt aber je nach Datumsformat möglicherweise nicht zu dem genauen Ergebnis, das Sie benötigen (Einzelheiten zu Datumskonvertierungsformaten finden Sie im PostgreSQL-Handbuch). Das von Ihnen verwendete Eingabeformat sollte jedoch problemlos funktionieren (versuchen Sie es mit SELECT CAST('2012-05-01' AS DATE)
direkt in PostgreSQL, wird dies beispielsweise ein korrektes PostgreSQL-Datum zurückgeben.)
Beachten Sie dies bei Verwendung von new java.sql.Date(cin.getTime())
, treten wahrscheinlich Zeitzonenprobleme auf. Sie könnten java.sql.Date.valueOf(...)
verwenden auch.
Zur Verdeutlichung nach Ihrer Bearbeitung:
Dies wird nicht funktionieren, da die Daten Teil der SQL-Syntax selbst wären, keine Zeichenfolgen oder Daten:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Sie müssten mindestens '
verwenden Anführungszeichen: . Hier könnten Sie bis zu einem gewissen Grad erwarten, dass die Parameter richtig formatiert sind, aber tun Sie es nicht. Außerdem müsste der String noch mit "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
gecastet werden oder '...'::DATE
.
Der einfachste Weg wäre sicherlich:
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);
(Wie a_horse_with_no_name in einem Kommentar anmerkte, würde die allgemeine Abfrage aufgrund Ihrer inneren Auswahl sowieso nicht funktionieren.)