Zní to, jako byste argument předali jejich zřetězením přímo do řetězce. To je velmi špatný nápad, protože to může vést k injekcím SQL. Vždy použijte PreparedStatement
s
pomocí ?
zástupné symboly pro předávání parametrů, nikdy je nepředávejte přímo jejich zřetězením přímo do řetězce dotazu (více, budete potřebovat '
oddělovače kolem).
Můžete mít něco jako:
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();
Případně je převod interního data PostgreSQL obvykle docela dobrý a flexibilní. Parametr řetězce můžete přetypovat na datum pomocí PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
To je flexibilní, ale nemusí vést k přesnému výsledku, který potřebujete v závislosti na formátu data (podrobnosti o formátech převodu data naleznete v příručce PostgreSQL). Vstupní formát, který používáte, by však měl fungovat dobře (Zkuste SELECT CAST('2012-05-01' AS DATE)
přímo v PostgreSQL, například to vrátí správné datum PostgreSQL.)
Pamatujte, že při použití new java.sql.Date(cin.getTime())
, pravděpodobně narazíte na problémy s časovým pásmem. Můžete použít java.sql.Date.valueOf(...)
taky.
Pro upřesnění postupujte podle vaší úpravy:
Toto nebude fungovat, protože data by byla součástí samotné syntaxe SQL, nikoli řetězce nebo data:"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Museli byste alespoň použít '
citáty: . Zde byste do určité míry mohli očekávat, že parametry budou správně naformátovány, ale nedělejte to. Navíc by stále musel přetypovat řetězec pomocí "SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
nebo '...'::DATE
.
Nejjednodušší způsob by jistě byl:
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 a_horse_with_no_name zdůraznil v komentáři, obecný dotaz by stejně nefungoval kvůli vašemu vnitřnímu výběru.)