我有一个配置表,我在其中配置选择子句查询字符串,我将获取该字符串并运行 nativeQuery。
我正在尝试实现一种功能,即我使用 spring-boot 将数据库返回的值传递给本机 MySQL/hibernate 查询,但遇到问题 由 org.hibernate.exception.SQLGrammarException:无法提取结果集
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行的"选择* FROM FROM FROM 用户CREATE_DATE>"附近使用的正确语法 \'2019-03-27 19:06:02\'' 线程"Reports"中的异常 org.springframework.dao.InvalidDataAccessResourceUsageException: 无法提取 ResultSet;SQL [n/a];嵌套异常是 org.hibernate.exception.SQLGrammarException:无法提取结果集
传递给@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;
此外,如果要将查询放入数据库中,则最终必须编写另一个查询来获取它。此外,您将在查询读取上浪费额外的读取时间。