Я использую 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
Есть ли другой способ использовать собственные запросы, где вы можете установить параметры.
Ошибка возникает, потому что когда вы устанавливаете параметр для запроса, он вычисляется как строковый литерал в сгенерированном SQL не как имя столбца. Так что это становится
SELECT STDDEV('column_name') FROM Player ...
вместо
SELECT STDDEV(column_name) FROM Player ...
что вызывает ошибку, потому что функция ожидает имя столбца или числовое значение.
Вы не можете динамически устанавливать имя столбца в запросе JPA. Вы должны либо жестко указать его, либо использовать другие способы построения запроса. См. Это сообщение qaru.site/questions/1162393/... для получения более подробной информации.