2014-12-03 4 views
0

Я тестировал код снова и снова, обнаружив, что проблема является одиночной цитатой. Как вы можете видеть в следующем запросе, я использовал одиночную цитату в предложении where. Если я удалю это, я получаю результат, но если я верну его, даже если строки, которые удовлетворяют фильтру, ничего не возвращают. Я также попытался использовать представление об этом. Помещение предложения where в представление и выбор вида напрямую, а не использование какого-либо фильтра. Тем не менее он ничего не возвращает.Java JDBC Postgres: выберите с одной цитатой

try { 
    Class.forName("org.postgresql.Driver").newInstance(); 
    Connection Conn = DriverManager.getConnection("jdbc:postgresql://{ipaddress}/database?user=postgres&password=password"); 

    Statement Stmt = Conn.createStatement(); 
    String sqlCommand = "SELECT col1_timestamp , col2 FROM table WHERE col1_timestamp > '00:01:00' "; 

    ResultSet RS = Stmt.executeQuery(sqlCommand); 

    while (RS.next()) { 
     data.add(RS.getInt("col1_timestamp ") 
       + "=>" + RS.getString("col2")); 
    } 
    // Clean up after ourselves 
    RS.close(); 
    Stmt.close(); 
    Conn.close(); 
} 
catch (SQLException E) { 
    System.out.println("SQLException: " + E.getMessage()); 
    System.out.println("SQLState:  " + E.getSQLState()); 
    System.out.println("VendorError: " + E.getErrorCode()); 
} 
catch(Exception ex) 
{ 
    System.out.println(ex.getMessage()); 
} 

я уже пробовал:

String sqlCommand = "SELECT col1_timestamp, col2 FROM table " 
       + " WHERE col2= ? AND (now() - col1_timestamp::timestamp with time zone) < interval ? "; 

     PreparedStatement preparedStatement = Conn.prepareStatement(sqlCommand); 
     preparedStatement.setString(1, "test"); 
     preparedStatement.setTime(2, new Time(new Long(-28680000))); //String(2, "00:02:00"); 

Тем не менее не работает, вместо этого он выдает ошибку на втором параметре.

Это довольно простая задача, но она всегда возвращает пустое значение.

Любая идея?

ответ

1

интервала литералов весьма ограничены (в SQL в целом и в Postgres), и вы не можете использовать параметр для единицы интервала буквального

Если у вас всегда есть один и тот же блок (например, минут) вы может сделать что-то вроде этого:

String sqlCommand = 
    "SELECT col1_timestamp, col2 FROM table " + 
    " WHERE col2= ? " + 
    " AND (now() - col1_timestamp::timestamp with time zone) < interval '1' minute * ?"; 

PreparedStatement preparedStatement = Conn.prepareStatement(sqlCommand); 
preparedStatement.setString(1, "test"); 
preparedStatement.setInt(2, 5); // five minutes 

Если вам необходимо запрашивать различные единицы (часы, минуты, дни), то вам необходимо либо использовать вывоза мебели количество минут для каждого из них или изменить SQL, каждый раз, когда: interval '1' day * ? или interval '1' hour * ?

+0

- это единственная цитата, которая вызывает беспокойство? Когда я также пытался использовать представление, это выходит неправильно. – oneofakind

+0

Пробовал это, и он выдает ошибку во втором параметре, говоря о ERROR: синтаксическая ошибка в точке или около $ 2 – oneofakind

+0

@oneofakind: не уверен, что вы имеете в виду с проблемой одиночных кавычек. Код, как я показал, работает для меня, должно быть, вы не говорите нам. Также ваше сообщение об ошибке также не соответствует коду. В моем примере нет 2 доллара –

Смежные вопросы