首页 > 解决方案 > 有什么方法可以在 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

我想从参数中动态使用表名。可能吗?如果是,请告诉我怎么做?

标签: javasqlspringspring-data-jpaspring-data

解决方案


这是不可能的,@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 注入。


推荐阅读