У меня есть веб-приложение, подключенное к postgresql. Я пытаюсь получить данные из базы данных с помощью подготовленного оператора и постоянно получаю синтаксическую ошибку, равную нулю или близкую к ней.

Ниже приведен мой фрагмент кода для запроса:

PreparedStatement pstmt = conn.prepareStatement("SELECT * "+ "FROM rooms1 o " + "JOIN rooms2 op" +
                                                 " ON o.room_id = op.room_id " +"JOIN rooms3 p " +
                                                 " ON op.person_id = p.person_id " +
                                                 "WHERE o.room_id = ? " +
                                                 " ORDER BY o.plate_order ASC;")) {
  //Rest of code

Этот запрос отлично работает при проверке в тестовой базе данных, но при использовании его внутри подготовленного оператора он дает ошибку как

Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "null"
position: 54

Из некоторых исследований я думаю, что проблема связана с моим запросом, также я впервые пишу запросы Postgresql. пожалуйста, посмотрите на это.

0
Fatima Nasim 8 Окт 2019 в 15:44
1
Вы абсолютно уверены, что все ваши параметры установлены на разумные значения?
 – 
Thorbjørn Ravn Andersen
8 Окт 2019 в 15:46
Повторяя здесь вопрос Торбьёрна, Равн Андерсен задал его, просто чтобы уточнить - устанавливаете ли вы значение параметра для подготовленного оператора перед его выполнением (например, 'pstmt.setString (1, "RM123");')? вы, возможно, отправляете нулевое значение?
 – 
Pete Kelley
8 Окт 2019 в 15:55
Да, я почти уверен в этом.
 – 
Fatima Nasim
8 Окт 2019 в 15:56
Вы должны иметь возможность получить фактический запрос, отправленный на сервер, путем поиска в текстовом журнале. Эта ошибка указывает на неправильную структуру запроса, а не на значения, отправленные в подготовленный оператор (я считаю, что невозможно вызвать эту ошибку после подготовки оператора). Вы сможете найти журналы в местоположении, указанном SELECT string_agg(setting, '/' ORDER BY name) FROM pg_catalog.pg_settings WHERE name IN('data_directory', 'log_filename', 'log_directory');
 – 
Łukasz Kamiński
8 Окт 2019 в 16:39
Вероятно, вы не выполняете запрос, который, как вы думаете, вы выполняете. Загляните в файл журнала сервера PostgreSQL, чтобы найти запрос с ошибкой, при этом не мешает обфускация клиентской библиотеки.
 – 
jjanes
8 Окт 2019 в 18:01

2 ответа

O.room_id =? если ? имеет значение null, поэтому вы должны проверить "o.room_id is null". Вы можете проверить это с помощью встроенного, если

0
hossein rasekhi 8 Окт 2019 в 15:48
Маловероятно, чтобы решить эту проблему, поскольку сравнение столбца со значением NULL с использованием оператора = пока не имеет смысла, не приведет к появлению сообщения об ошибке.
 – 
Łukasz Kamiński
8 Окт 2019 в 16:57

Я указал позицию ошибки 54 с помощью ***:

SELECT * FROM rooms1 o
JOIN rooms2 op ON o.room_id = ***op.room_id
JOIN rooms3 p  ON op.person_id = p.person_id
WHERE o.room_id = ?
ORDER BY o.plate_order ASC

Я не совсем понимаю сообщение об ошибке, но op.room_id, возможно, имеет нулевое значение.

Странная ошибка IMHO, но попробуйте LEFT JOIN

SELECT o.*, op.*, p.* FROM rooms1 o
LEFT JOIN rooms2 op ON o.room_id = op.room_id
LEFT JOIN rooms3 p  ON op.person_id = p.person_id
WHERE o.room_id = ?
ORDER BY o.plate_order ASC

(Точка с запятой ; в конце лишняя.)

0
Joop Eggen 8 Окт 2019 в 16:12
2
Это не приведет к ошибке, если один из столбцов JOIN содержит значения NULL; он просто не будет JOIN этих строк, поэтому LEFT JOIN не решит его.
 – 
Łukasz Kamiński
8 Окт 2019 в 16:27
Действительно, мне уже было интересно, был ли SELECT * расширен до фактических столбцов, чтобы позиция 54 указывала на какой-то нуль. К сожалению, у меня мало опыта работы с Postgresql.
 – 
Joop Eggen
8 Окт 2019 в 16:46