Ошибка возврата значения с использованием Java для выполнения Upsert в PostgreSQL - PullRequest
0 голосов
/ 09 апреля 2020

Я видел несколько постов об этом топи c ( post1 , post2 , post3 ). Во всех них решение выглядит очень просто, но я не могу получить значение возвращаемого значения.

Это то, что я пробовал до сих пор:

Опция 1:

int affectedRows =pstmt.executeUpdate();    
    ResultSet rs = pstmt.getResultSet(); 
    if (rs.next())
        updated = rs.getBoolean(1); 

Результат: java.lang.NullPointerException вызвать, если (rs.next())

Опция 2:

ResultSet rs =pstmt.executeQuery(); 
    if (rs.next())
        {updated = rs.getBoolean(1);}   

Результат : org.postgresql.util.PSQLException: No results were returned by the query

Вариант 3:

boolean hasResult =pstmt.execute(); 
logger.info("hasResult: " + hasResult);
//if (hasResult) {
    ResultSet rs = pstmt.getResultSet(); 
    if (rs.next())
        updated = rs.getBoolean(1);             
//}
logger.info("updated: " + updated);

Результат: java.lang.NullPointerException вызвать, если (rs.next()) также заметит hasResult: false

Запрос, созданный в коде Java, выглядит следующим образом:

INSERT INTO public."tablename"( "field1", "field2", ...,"field n")
VALUES('value1','value2',...,'value n') 
ON CONFLICT ("UniqueID") 
DO UPDATE SET "field1" = 'value3' ,..., "Updated"=true 
RETURNING "Updated"

Если я выполняю запрос, например, с помощью pgadmin, я вижу возвращаемое значение «Обновлено»

pgadmin

Примечание. В каждом варианте запрос выполняется без проблем, но я не могу получить значение «Обновлено»

Это зависимость maven:

<dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.2.12</version>
</dependency>
<dependency>
        <groupId>com.google.cloud.sql</groupId>
        <artifactId>postgres-socket-factory</artifactId>
        <version>1.0.15</version>
</dependency>

И строка подключения:

jdbc:postgresql://google/postgres?cloudSqlInstance=<...>&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=<...>&password=<...>

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Проблема была здесь:

PreparedStatement pstmt = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS);

Когда я создал объект PreparedStatement pstmt, я использовал Statement.RETURN_GENERATED_KEYS

Использование константы Statement.RETURN_GENERATED_KEYS для использования с getGeneratedKeys для получения автоматически сгенерированные ключи всех строк, созданных этим исполнением.

Как я хочу, чтобы заданный c возвращаемый элемент я должен использовать:

PreparedStatement pstmt = conn.prepareStatement(SQL);
0 голосов
/ 09 апреля 2020

Попробуйте что-то вроде ResultSet rs=stmt.executeQuery(sql).
Не вижу, где передается sql.
или
PreparedStatement statement = connection.prepareStatement(sql);
ResultSet result = statement.executeQuery();

...