我有一个配置表,在其中配置select子句查询字符串,我将获取该字符串并运行nativeQuery。
我正在尝试实现一种功能,该功能是使用spring-boot将数据库返回的值传递给本机MySQL / hibernate查询,但是由于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 --- [批处理] o.h.engine.jdbc.spi.SqlExceptionHelper:您的SQL语法有错误;检查与您的MySQL服务器版本对应的手册以获取正确的语法,以在第1行的``SELECT * FROM users where CREATE_DATE> \'2019-03-27 19:06:02 \'''附近使用正确的语法 线程“ Reports”中的异常org.springframework.dao.InvalidDataAccessResourceUsageException:无法提取ResultSet。 SQL [n / a];嵌套的异常是org.hibernate.exception.SQLGrammarException:无法提取ResultSet
答案 0 :(得分:0)
您传递给@Query的查询应该是有效的JPQL。您传递的是JPA无法理解的SQL查询。因此是错误。
您应该这样写:
//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/
更新
您可以将查询放在属性文件中,然后从那里读取它们:
//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;
此外,如果要将查询放入数据库中,则最终必须编写另一个查询以进行查询。另外,您将在查询读取上浪费额外的读取时间。