Передача значения запроса конфигурации базы данных в собственные запросы - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть таблица конфигурации, в которой я настраиваю строку запроса выбора пункта, я получаю эту строку и запускаю nativeQuery.

Я пытаюсь добиться функциональности, когда я передаю возвращенные значения базы данных в собственный запрос MySQL / hibernate с помощью spring-boot, но возникают проблемы с «Причиной org.hibernate.exception.SQLGrammarException: невозможно извлечь ResultSet

»
ConfigDTO reportsConfigDTO = reportsConfigRepository.getReportByCustomValue();

ConfigDTO имел поле с именем SelectClause, когда при выполнении запроса я получаю значение SelectClause из базы данных, например

SELECT * FROM users where  CREATE_DATE > '2019-03-27 19:06:02'

Я пытаюсь передать это значение другому запросу.

String query = reportsConfigDTO.getSelectClause();

UserDTO userDTO = userRoleRepository.getReportByCustom(query);

Мой собственный запрос в хранилище:

@Query(value = ":query",  nativeQuery=true)
public UserDTO getReportByCustom(@Param("query") String query);

Так что в основном я передаю SELECT * FROM users where CREATE_DATE > '2019-03-27 19:06:02', который возвращается из предыдущего запроса, userRoleRepository.getReportByCustom

Я что-то не так делаю? не уверен, что это правильный подход,

Я получаю ниже исключение sql

Ошибка SQL: 1064, SQLState: 42000 2019-03-31 16: 51: 00.116 ОШИБКА 33850 --- [Batch] o.h.engine.jdbc.spi.SqlExceptionHelper: в синтаксисе SQL имеется ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с '' SELECT * FROM пользователей, где CREATE_DATE> \ '2019-03-27 19: 06: 02 \' '' в строке 1 Исключение в потоке "Отчеты" org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось извлечь ResultSet; SQL [н / п]; вложенное исключение - org.hibernate.exception.SQLGrammarException: не удалось извлечь ResultSet

1 Ответ

0 голосов
/ 01 апреля 2019

Запрос, который вы передаете @Query, должен быть допустимым JPQL.То, что вы передаете, - это SQL-запрос, который JPA не понимает.Отсюда и ошибка.

Вы должны написать что-то вроде этого:

//Here UserDTO should be your Entity name. 
//Since date is a variable, you should receive it from the caller.
//Here `u` will automatically be an object of UserData pojo.
String QUERY = "SELECT u FROM UserDTO where CREATE_DATE > :date"

@Query(value = QUERY,  nativeQuery=true)
public UserDTO getReportByCustom(@Param("date") LocalDateTime date);

Вы можете просмотреть ссылку на JPQL здесь - https://docs.oracle.com/html/E13946_04/ejb3_langref.html и https://thoughts -on-java.org/jpql/

ОБНОВЛЕНИЕ

Вы можете поместить Querys в файл свойств и читать их оттуда так:

//Some sql-query.properties file added to your classpath
sql.query.userQuery=SELECT u FROM UserDTO where CREATE_DATE > :date

и на вашем уровне DAO прочитайте это так:

@Value("${sql.query.userQuery}")
String QUERY;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...