gpt4 book ai didi

java - 有没有办法在 Hibernate 的 @query 注释中使用 @params 中的表名?

转载 作者:行者123 更新时间:2023-11-30 01:48:19 25 4
gpt4 key购买 nike

我正在使用 Hibernate 和 Spring data JPA 构建一个 Web 项目。

在 Eclipse-Link 中,我们可以使用 native 查询,例如

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,您不能传递表的名称,因为它不被识别为任何实体。

它声明了Query的javadoc:

/**
* Defines the JPA query to be executed when the annotated method is called.
*/
String value() default "";

最好的解决方案不是将表名作为字符串传递,而是使用例如继承( link )或以某种方式重建数据模型来解决它。作为一个快速而肮脏的解决方案,我建议创建一个自定义存储库并使用 EntityManager.createNativeQuery 并将 sql 传递到那里。但请记住验证您正在编写的查询(验证用户输入,使用枚举作为表名),因为它可能导致 SQL 注入(inject)。

关于java - 有没有办法在 Hibernate 的 @query 注释中使用 @params 中的表名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57000709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com