Parece que você está passando o argumento concatenando-os diretamente na string. Esta é uma ideia muito ruim, pois pode levar a injeções de SQL. Sempre use
PreparedStatement
s
com o ?
espaços reservados para passar parâmetros, nunca os passe diretamente concatenando-os diretamente na string de consulta (mais ainda, você precisaria do '
delimitadores ao redor). Você poderia ter algo como:
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();
Alternativamente, a conversão de data interna do PostgreSQL geralmente é bastante boa e flexível. Você pode converter o parâmetro string para uma data com o PostgreSQL:
PreparedStatement stmt
= con.prepareStatement("SELECT id FROM Bookings WHERE checkIn=CAST(? AS DATE)");
stmt.setString(1, cinDate);
ResultSet results = stmt.executeQuery();
Isso é flexível, mas pode não levar ao resultado exato que você precisa dependendo do formato de data (você pode verificar o manual do PostgreSQL para obter detalhes sobre os formatos de conversão de data). O formato de entrada que você está usando deve funcionar bem (tente
SELECT CAST('2012-05-01' AS DATE)
diretamente no PostgreSQL, por exemplo, isso retornará uma data correta do PostgreSQL.) Observe que ao usar
new java.sql.Date(cin.getTime())
, é provável que você tenha problemas de fuso horário. Você pode usar java.sql.Date.valueOf(...)
também. Para esclarecer, seguindo sua edição:
Isso não funcionará, pois as datas fariam parte da própria sintaxe SQL, não strings ou datas:
"SELECT * FROM Rooms r where r.id not in (select * from search(" + cin +", " + cout +"))"
Você precisaria pelo menos usar
'
aspas:"SELECT * FROM Rooms r where r.id not in (select * from search("' + cin +"', '" + cout +"'))"
CAST('...' AS DATE)
ou '...'::DATE
. A maneira mais simples certamente seria:
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);
(Como a_horse_with_no_name apontou em um comentário, a consulta geral não funcionaria de qualquer maneira por causa de sua seleção interna.)