Пользовательский запрос репозитория JPA с весенней загрузкой - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь выполнить пользовательский запрос через интерфейс репозитория jpa следующим образом:

  @Query(
  value = "SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM ?1",
  nativeQuery = true)
public List<String> getNamesFromView( String viewName);

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

Я получаю исключение времени выполнения

nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement

Если я жестко закодирую имя таблицы, это нормально работает

1 Ответ

0 голосов
/ 20 ноября 2018

Имена таблиц не могут быть параметризованы, поэтому вы получаете ошибку.

Переменные связывания существуют в основном по соображениям производительности, параметризованный запрос будет скомпилирован БД только один раз, а для последующих последующих исполнений используется та же скомпилированная версия.

Значением для заполнителя будет строка,

Таким образом, SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM ?1 с xyz в качестве имени таблицы фактически переводит в

SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM 'xyz', что является недопустимым SQL

Как вы упомянули, у вас есть entityManager'sНапример, вы можете выполнить запрос, как показано ниже:

entityManager.query(String.format("SELECT (TRIM(TYPE_NAME) ||'.'|| TRIM(NAME)) AS NAMES FROM %s", viewName));
...