Созданное имя столбца не было найдено в Postgres результирующего набора

#java #postgresql #spring-boot #spring-data-jpa

#java #postgresql #spring-boot #spring-data-jpa

Вопрос:

 @Query(value = "UPDATE einvoice_message AS e1 SET message = null FROM (SELECT * FROM einvoice_message 
where created < :created ORDER BY :created LIMIT :limit FOR UPDATE SKIP LOCKED) AS e2 WHERE 
e1.einvoice_message_id = e2.einvoice_message_id RETURNING e1.einvoice_message_id", nativeQuery = true)
List<EinvoiceMessage> deleteEinvoiceMessageContent(@Param("created") OffsetDateTime created, 
@Param("limit") int limit);
  

У меня этот запрос выполнен в postresql, но я получаю SqlExceptionHelper - The column name created was not found in this ResultSet. , это должно быть e1.created или e2.created ? Но если это так, я не уверен, почему, не мог бы кто-нибудь объяснить причину и решение этой проблемы?

Это запрос для лучшей читаемости:

 UPDATE einvoice_message AS e1 
  SET message = null 
FROM (
  SELECT * 
  FROM einvoice_message 
  where created < :created 
  ORDER BY :created LIMIT :limit 
  FOR UPDATE SKIP LOCKED
) AS e2 
WHERE e1.einvoice_message_id = e2.einvoice_message_id 
RETURNING e1.einvoice_message_id
  

Странно то, что я могу выполнить этот скрипт с помощью инструмента запросов, и все работает нормально. Но ошибка в журнале четко указывает:

SqlExceptionHelper - The column name created was not found in this ResultSet.

Произошла непредвиденная ошибка в scheduled task. org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось выполнить запрос;

 SQL [UPDATE einvoice_message AS e1 SET message = null FROM (SELECT * FROM einvoice_message where created < ? 
ORDER BY ? LIMIT ? FOR UPDATE SKIP LOCKED) AS e2 WHERE e1.einvoice_message_id = e2.einvoice_message_id RETURNING e1.einvoice_message_id];

nested exception is org.hibernate.exception.SQLGrammarException: could not execute query
  

Моя таблица ddl:

 create table einvoice_message
(
    einvoice_message_id bigserial not null
        constraint einvoice_message_pk
            primary key,
    message bytea not null,
    created timestamp default now() not null
);
  

Комментарии:

1. Пожалуйста, поделитесь своим таблицей ddl.

2. @FrankieDrake добавил к моему вопросу

Ответ №1:

Ваш порядок по слегка неверен

 ORDER BY :created 
  

Для заказа по требуется имя столбца, а не значение. У вас должно быть

 ORDER BY created