Запрос в PostgresSQL работающий в терминале, не работает через JDBC Driver

279
18 мая 2017, 10:01

Есть 2 таблицы:

CREATE TABLE recruiter (
    nickname TEXT PRIMARY KEY NOT NULL,
    url_account TEXT NOT NULL,
    UNIQUE (nickname)
);
CREATE TABLE proposal (
    header TEXT NOT NULL,
    url_proposal TEXT NOT NULL,
    time_addition TIMESTAMP NOT NULL,
    nickname TEXT NOT NULL,
    UNIQUE (url_proposal, header),
    FOREIGN KEY (nickname) REFERENCES recruiter (nickname)
);

И есть запрос:

SELECT p.nickname, 
    p.header, 
    p.url_proposal, 
    p.time_addition, 
    r.url_account 
FROM proposal AS p
LEFT OUTER JOIN 
    recruiter AS r ON p.nickname = r.nickname 
WHERE p.nickname = (?)

И через терминал он отлично работает но когда я пытаюсь отправить его через JDBC Driver:

private Proposal getProposalByHeader(final String header) {
    final Proposal proposal = new Proposal();
    try (PreparedStatement statement = connection.prepareStatement(
            "SELECT p.nickname, p.url_proposal, p.time_addition, r.url_account" +
                    " FROM proposal AS p LEFT JOIN recruiter AS r ON p.nickname" +
                    " = r.nickname WHERE p.nickname = (?)")) {
        statement.setString(1, header);
        final ResultSet resultSet = statement.executeQuery();
        System.out.println(resultSet.next()); // false
        proposal.setNickname(resultSet.getString(1));
        proposal.setUlrPropose(resultSet.getString(2));
        proposal.setCreate(resultSet.getTimestamp(3));
        proposal.setUrlRecruiter(resultSet.getString(4));
        proposal.setHeader(header);
        return proposal;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return proposal;
}

Он падает с ошибкой:

org.postgresql.util.PSQLException: ResultSet not positioned properly, perhaps you need to call next.

Метод next() сразу возвращает false.

И стоит мне только заменить запрос на SELECT * FROM proposal WHERE header = (?)

И написать так:

private Proposal getProposalByHeader(final String header) {

    final Proposal proposal = new Proposal();
    try (PreparedStatement statement = connection.prepareStatement(
            "SELECT * FROM proposal WHERE header = (?)")) {
        statement.setString(1, header);
        final ResultSet resultSet = statement.executeQuery();
        System.out.println(resultSet.next()); // true !!!!!!!
        proposal.setNickname(resultSet.getString(4));
        proposal.setCreate(resultSet.getTimestamp(3));
        proposal.setUlrPropose(resultSet.getString(2));
        proposal.setHeader(header);
        return proposal;
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return proposal;
}

И все работает.

Как такое может быть что один и тот же не сложный запрос работая в терминале, через JDBC Driver тут же работать отказывается?

Подскажите пожалуйста что я делаю не так, и как мне это починить?

READ ALSO
Фоновый процесс в приложении на android

Фоновый процесс в приложении на android

Пишу небольшую утилиту под androidНазначение - чистка мусора, удаление ненужных файлов и тд

282
Работает ли RMI сервер через NAT?

Работает ли RMI сервер через NAT?

Можно ли получить доступ к RMI серверу, который находится за NAT? Если да, то как это можно сделать?

279
Чем в Android спарсить WebVTT?

Чем в Android спарсить WebVTT?

Чем в Android спарсить WebVTT? в обычный text или Pojo класс java?

295