java - 有什么方法可以在 Hibernate 的 @query 注释中使用来自 @params 的表名?
问题描述
我正在使用 Hibernate 和 Spring data JPA 来构建一个 Web 项目。
在 Eclipse-Link 中,我们可以使用原生查询,例如
String tableName = "sometablename";
String query = "SELECT * FROM " +tableName +"WHERE id > 10";
在 Hibernate 中,我使用 @Query 注释
@Query(value = "SELECT COUNT(r.id) as resultsCount FROM #{#resultTable} r WHERE r.customerId= :customerId AND r.is_deleted=0 AND r.is_ignored=0 ", nativeQuery = true)
Integer getResultsCount(@Param("customerId") int customerId,
@Param("resultTable") String resultTable);
我试过 #{#resultTable} 但这被替换为一个带引号的字符串,我得到一个异常
You have a error in your SQL Syntax
我想从参数中动态使用表名。可能吗?如果是,请告诉我怎么做?
解决方案
这是不可能的,@org.springframework.data.jpa.repository.Query
只需要 jpql,你不能传递表的名称,因为它不被识别为任何实体。
它说明了以下的 javadoc Query
:
/**
* Defines the JPA query to be executed when the annotated method is called.
*/
String value() default "";
最好的解决方案不是将表名作为字符串传递,而是使用例如继承(链接)或以某种方式重建数据模型来解决它。作为一个快速而肮脏的解决方案,我建议创建一个自定义存储库并EntityManager.createNativeQuery
在那里使用和传递 sql。但请记住验证您正在编写的查询(验证用户输入,使用枚举作为表名),因为它可能导致 sql 注入。
推荐阅读
- winston - 温斯顿记录器 2 到 3 升级。逗号分隔的消息不再连接
- nativescript - 在 iOS 中下载文件
- python - 如何从 python 中使用 Qt 的“图形视图”框架?
- c# - MVC中有什么不能在webform中实现的吗
- c# - 为什么它不起作用?StartupLocation = WPF 中的 CenterOwner
- c++ - I can't access my winsock server from another computer (but localhost works)
- python - 在 Cloud Build 管道中运行 python 测试的最佳做法是什么?
- jquery - 我们可以在使用 jQuery QueryBuilder 时在多个规则之间添加 AND/OR 吗?不使用组的库
- android - 列表视图中的有状态小部件和重新加载导致错误
- node.js - 对于主机名“localhost”上的 TCP 端口:$ serve -l 5002 command -l not found