Wygląda na to, że przekazujesz argument, łącząc go bezpośrednio w łańcuchu. To bardzo zły pomysł, ponieważ może prowadzić do wstrzyknięć SQL. Zawsze używaj PreparedStatement
s
z ?
symbole zastępcze do przekazywania parametrów, nigdy nie przekazuj ich bezpośrednio, łącząc je bezpośrednio w ciągu zapytania (co więcej, potrzebujesz '
ograniczniki wokół).
Możesz mieć coś takiego:
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();
Alternatywnie, wewnętrzna konwersja danych PostgreSQL jest zwykle dość dobra i elastyczna. Możesz rzutować parametr ciągu na datę za pomocą PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Jest to elastyczne, ale może nie prowadzić do dokładnego wyniku, którego potrzebujesz, w zależności od formatu daty (możesz sprawdzić podręcznik PostgreSQL, aby uzyskać szczegółowe informacje na temat formatów konwersji dat). Format wejściowy, którego używasz, powinien działać poprawnie (Spróbuj SELECT CAST('2012-05-01' AS DATE)
na przykład bezpośrednio w PostgreSQL zwróci poprawną datę PostgreSQL.)
Zauważ, że używając new java.sql.Date(cin.getTime())
, prawdopodobnie napotkasz problemy ze strefą czasową. Możesz użyć java.sql.Date.valueOf(...)
też.
Aby wyjaśnić, po swojej edycji:
To nie zadziała, ponieważ daty byłyby częścią samej składni SQL, a nie ciągami lub datami:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Musisz przynajmniej użyć '
cytaty: . Tutaj, do pewnego stopnia, możesz oczekiwać, że parametry będą poprawnie sformatowane, ale nie rób tego. Ponadto nadal musiałby rzutować ciąg za pomocą "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
lub '...'::DATE
.
Najprostszym sposobem z pewnością byłoby:
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);
(Jak zauważył a_koń_bez_nazwy w komentarzu, ogólne zapytanie i tak nie zadziałałoby z powodu twojego wewnętrznego wyboru).