在 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 中将查询作为查询参数传递的主要内容,如果未能解决你的问题,请参考以下文章