在 JPQL Native Query 中将查询作为查询参数传递

Posted

技术标签:

【中文标题】在 JPQL Native Query 中将查询作为查询参数传递【英文标题】:Passing a query as a query parameter in JPQL Native Query 【发布时间】:2021-09-21 16:34:29 【问题描述】:

我正在尝试在另一个 JPQL 本机查询中将查询作为字符串参数传递。

@Query(value = "SELECT (:query)", nativeQuery = true)
BigDecimal getTotal(@Param("query") String query);

所以结果查询类似于下面的查询,它返回一个值

SELECT (50 * (SELECT COUNT(*) FROM SOMETABLE))

但我得到的只是:query 参数的字符串,而不是执行的完整查询的结果。

【问题讨论】:

你正在尝试的东西是不可能的。参数将使用准备好的语句绑定,并且您不能传递查询。为什么不用你要执行的真实语句编写查询呢? @SimonMartinelli 我知道这是一个奇怪的实现,但是我作为参数传递的查询是生成并存储在一个表中的,它代表一个可以改变的更大公式的一部分,这就是我为什么尝试以这种方式构建查询,以便我可以创建一个包含所有生成的子查询的查询。 【参考方案1】:
    为自定义存储库创建接口SomeRepositoryCustom
public interface SomeRepositoryCustom 

    BigDecimal getTotal(String sql);


    创建SomeRepositoryCustom 的实现
@Repository
class SomesRepositoryCustomImpl implements SomeRepositoryCustom 

    private JdbcTemplate template;

    @Autowired
    public SomesRepositoryCustomImpl(JdbcTemplate template) 
        this.template = template;
    

    @Override
    public BigDecimal getTotal(String sql) 
        return template.queryForObject(sql, BigDecimal.class);
    


    使用SomeRepositoryCustom 扩展您的JpaRepository
@Repository
public interface SomeRepository extends JpaRepository, SomeRepositoryCustom 


运行查询

someRepository.getTotal("SELECT (50 * (SELECT COUNT(*) FROM SOMETABLE))");

【讨论】:

以上是关于在 JPQL Native Query 中将查询作为查询参数传递的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 查询在测试中工作,而不是在生产中

带有枚举值的 jpql IN 查询

19 JPQL

用二元运算符 mysql 查询更新列的 JPQL jpa (@Query) 是啥?

如何在 JPQL 中正确执行 LIKE 和 CASE 子句

输入参数集合包含 null 的 JPQL 查询