Параметры нативного запроса не работают в Java EE

1

Я использую JPA через Java EE и имею следующий пользовательский запрос postgresql:

@NamedNativeQuery(name = "Player.getStandardDev", query ="SELECT STDDEV(?1) FROM Player WHERE ?2 IS NOT NULL")

(Я понимаю, что проверка на IS NOT NULL, вероятно, не нужна, но в этом случае это не является источником проблемы).

Затем я пытаюсь выполнить следующий код:

Query query = getEntityManager().createNamedQuery("Player.getStandardDev");
query.setParameter(1, attribute);
query.setParameter(2, attribute);
return (BigDecimal) query.getSingleResult();

Когда getSingleResult(), я получаю следующую ошибку:

org.postgresql.util.PSQLException: ERROR: function stddev(character varying) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.
  Position: 8

Я предполагаю, что это происходит потому, что вызовы setParameter работают некорректно и поэтому не заменяют ? s

Есть ли другой способ использовать собственные запросы, где вы можете установить параметры.

Теги:
jpa
java-ee

1 ответ

1
Лучший ответ

Ошибка возникает, потому что когда вы устанавливаете параметр для запроса, он вычисляется как строковый литерал в сгенерированном SQL не как имя столбца. Так что это становится

SELECT STDDEV('column_name') FROM Player ...

вместо

SELECT STDDEV(column_name) FROM Player ...

что вызывает ошибку, потому что функция ожидает имя столбца или числовое значение.

Вы не можете динамически устанавливать имя столбца в запросе JPA. Вы должны либо жестко указать его, либо использовать другие способы построения запроса. См. Это сообщение qaru.site/questions/1162393/... для получения более подробной информации.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню