java - 将数据库配置查询值传递给 native 查询

标签 java mysql spring hibernate spring-boot

我有一个配置表,我在其中配置 select 子句查询字符串,我将获取该字符串并运行 nativeQuery。

我正在尝试实现一个功能,使用 spring-boot 将数据库返回的值传递给 native MySQL/hibernate 查询,但遇到 Caused by 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);

我在存储库中的 native 查询是

@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 Error: 1064, SQLState: 42000 2019-03-31 16:51:00.116 ERROR 33850 --- [ Batch] o.h.engine.jdbc.spi.SqlExceptionHelper : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''SELECT * FROM users where CREATE_DATE > \'2019-03-27 19:06:02\''' at line 1 Exception in thread "Reports" org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

最佳答案

传递给 @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.htmlhttps://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;

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

关于java - 将数据库配置查询值传递给 native 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55445460/

相关文章:

java - Android onPreExecute方法报奇怪错误

mysql - JOIN、ORDER BY 和 GROUP BY 在同一语句中

java - 我通过 "for"中的 getSingleResult 调用 Sql 存储过程,但每行的结果都相同

php - Mysql 组列并按字母顺序排序 - 涉及 PHP

mysql - 如何使用一个 MySQL 查询从我的表中获取所有最新的 "versions"?

java - Spring Session 与 Spring Security 创建两个 session

java - 在 Spring 中配置 Hibernate 模型发现

java - Hibernate envers 自定义表

java - 打印字符串数组字典顺序中第一个元素时出现问题(java)

java - 为不可修改的列表实现迭代器