Запрос на извлечение строк, в которых столбец, имеющий нулевое значение, всегда возвращает пустой, даже если в БД есть совпадающие записи - PullRequest
0 голосов
/ 18 июня 2019

Всегда следующий код возвращает пустые строки, хотя в БД есть соответствующие записи:

String sql = "select * from test5 where id2 = ? ";
    return opsbldJdbcTemplate.query(sql, new PreparedStatementSetter() {
        @Override
        public void setValues(PreparedStatement ps) throws SQLException {
            ps.setNull(1, java.sql.Types.BIGINT);
        }
    }, new ResultSetExtractor<List<Map<String,Object>>>() {
        public List<Map<String,Object>> extractData(ResultSet rs) throws SQLException, DataAccessException {
            List<Map<String,Object>> lms = new ArrayList<>();
            while(rs.next()) {
                Map<String,Object> mss = new HashMap<>();
                lms.add(mss);
                mss.put("id1", "" + rs.getInt(1));
                mss.put("id2", "" + rs.getLong(2));
                mss.put("id4", "" + rs.getDouble(4));
            }

            return lms;
        }
     });
}       
ppql=> \d test5
                      Table "public.test5"
 Column |         Type          | Collation | Nullable | Default
--------+-----------------------+-----------+----------+---------
 id1    | integer               |           |          |
 id2    | bigint                |           |          |
 id3    | smallint              |           |          |
 id4    | double precision      |           |          |
 id5    | numeric(10,2)         |           |          |
 id6    | real                  |           |          |
 id7    | character varying(30) |           |          |
 id8    | text                  |           |          |
 id9    | character(30)         |           |          |


ppql=> select * from test5 where id2 is NULL;
 id1 | id2 | id3 | id4 | id5 | id6 | id7 | id8 | id9
-----+-----+-----+-----+-----+-----+-----+-----+-----
   4 |     |     |     |     |     |     |     |
(1 row)

Не уверен, почему он не возвращает никаких строк. Сделали все возможные попытки получитьна это, но безрезультатно

Я пробовал много вариантов функции запроса и queryforList и т. д., но не помогает

1 Ответ

0 голосов
/ 18 июня 2019

Нулевая проверка не может быть выполнена с = null, вместо этого она должна быть сделана так:

select * from test5 where id2 is null

Если попытаться сделать это с установкой нуля, через

ps.setNull(1, java.sql.Types.BIGINT);

выдает исключение из драйвера JDBC:

org.postgresql.util.PSQLException: ERROR: syntax error at or near "$1"
  Position: 34
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2440)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2183)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:308)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:441)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:365)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:143)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:106)

Одним из возможных решений является сделать конкретный запрос в этом случае:

select * from test5 where id2 is null

Тест

Здесь автономная Java-программа с JDBC:

import java.util.Properties;
import java.sql.*;

public class Main {

    public static void main(String[] args) {
        try {
            Connection connection = createConnection();
            try (connection) {
                /*
                PreparedStatement ps = connection.prepareStatement(
                        "select * from test5 where id2 is ?");
                ps.setNull(1, java.sql.Types.BIGINT);
                 */
                PreparedStatement ps = connection.prepareStatement(
                        "select * from test5 where id2 is null");

                try (ResultSet rs = ps.executeQuery()) {
                    while(rs.next()) {
                        int id1 = rs.getInt(1);
                        System.out.println("found entry with id1='" + id1 + "'");
                    }
                }
                ps.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private static Connection createConnection()
            throws ClassNotFoundException, SQLException {
        Class.forName("org.postgresql.Driver");
        String url = "jdbc:postgresql://localhost/stephan";
        Properties props = new Properties();
        props.setProperty("user", "stephan");
        props.setProperty("password", "secret");
        return DriverManager.getConnection(url, props);
    }
}

Если содержимое таблицы test5 выглядит следующим образом:

stephan=# select * from test5;
 id1 | id2 | id3 | id4 | id5 | id6 | id7 | id8 | id9 
-----+-----+-----+-----+-----+-----+-----+-----+-----
   4 |     |     |     |     |     |     |     | 
(1 row)

тогда вывод на консоль отладки выглядит так:

found entry with id1='4'
...