将数据库配置查询值传递给本机查询



我有一个配置表,我在其中配置选择子句查询字符串,我将获取该字符串并运行 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;

此外,如果要将查询放入数据库中,则最终必须编写另一个查询来获取它。此外,您将在查询读取上浪费额外的读取时间。

相关内容

  • 没有找到相关文章

最新更新