java - spring-data-jdbc 中的参数化顺序
问题描述
我正在努力使订单参数化。最好的就是拥有
... order by :orderColumn :orderDirection ...
是否可以转:
@Query("select * from Document where folderId = :folderId AND documentType = :documentType"
+ " order by created desc limit :limit")
List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType,
String orderColumn, Integer limit);
进入:
@Query("select * from Document where folderId = :folderId AND documentType = :documentType"
+ " order by :orderColumn desc limit :limit")
List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType,
String orderColumn, Integer limit);
我正在使用 spring-data-jdbc 1.1.3.REELASE 版本。即使只为列名这样做也会对我有很大帮助。
解决方案
无法用绑定参数替换列名。这是 JDBC 的限制,甚至可能是 SQL 的限制。
您可以做的是使用一个表达式,该表达式根据绑定参数计算出不同列的值。就像是
... ORDER BY CASE
WHEN :orderColumn = 'created' THEN created
WHEN :orderColumn = 'updated' THEN updated
WHEN :orderColumn = 'deleted' THEN deleted
ELSE 1
END;
请注意,查询优化器不能很好地支持这种构造,因此不会使用任何原本适用的索引。
如果您需要优化器提供更好的支持,您始终可以编写动态创建的自定义查询。如果您决定这样做,请确保不要在 SQL 语句中合并来自不受信任来源的字符串,以避免 SQL 注入漏洞。
推荐阅读
- php - 使用 jQuery 和 Laravel 从组合选择中获取值并将结果显示到文本字段
- javascript - 如何解决在提交发布路由时获取传递到 ejs 文件的数据的引用错误?
- c++ - My C++ program won't compile on Visual Studio code
- python - 无法使用 .backwards() 在 Pytorch 模块中反向传播;权重没有更新
- python - Plot the resampled function over the original one
- c - 如何用一些逻辑初始化全局?
- android - How to check if a library already defined in make file
- dart - Dart, Only static members can be accessed in initializers in simple class example
- python - Python:Selenium,通用 XPATH 上的 NoSuchElementException
- java - 如何在与 @SpringBootApplication 注释的类不同的类中分离 bean