[英]Parametrised order in 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 版本。 即使只为列名做这件事也会对我有很大帮助。
使用PagingAndSortingRepository
@Query("select * from Document where folderId = :folderId AND documentType = :documentType")
List<Document> findByFolderIdAndDocumentTypeOrderByWithLimit(Long folderId, String documentType, Pageable pageable);
并调用该方法:
findByFolderIdAndDocumentTypeOrderByWithLimit(1,"Type", PageRequest.of(0, <limit>, Sort.by(<column name>).descending());
举个例子,你可以在这里罚款
用绑定参数替换列名是不可能的。 这是 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 注入漏洞。
在有支持 Pagable 对象的spring-data-jdbc
(据我所知 2.XXRELEASE)之前,我已经决定针对这种特殊情况使用NamedParameterJdbcTemplate
并NamedParameterJdbcTemplate
我自己的查询。 我希望这里的这个或其他答案会对某人有所帮助。 感谢您的帮助 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.