我想使用jpa @Query
,发现类型String
的参数将在sql语句中自动括在单引号(''
)中。由于它是一个子查询,因此将导致SQL错误:
@Query(value="select cate_id,dt,channel,game_id,new_income_money,new_account,consume from ? " +
" where cate_id=? and dt between ? and ?" ,nativeQuery = true)
List<TfData> findTfRangeData(String subsql, Integer cate_id, String start_dt, String end_dt);
我该怎么做才能防止这种行为?
答案 0 :(得分:1)
此功能旨在防止SQL injection攻击-它不是通过串联攻击者可以利用的原始文本,而是使用参数化查询以安全的方式添加参数。
不幸的是,您实际上是在尝试使用 SQL注入来实现所需的功能。您应该考虑进行更改,而不是构建包含动态查询的String
,而应使用某种DSL库。
Spring-Data-JPA支持执行此操作的几种方法,包括Criteria,Specifications和QueryDSL。
This post简要介绍了如何使用它们。
答案 1 :(得分:-1)