我正在努力使订单参数化。最好的是有
... 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 版本。即使只是为列名做这件事也会对我有很大帮助。
最佳答案
用绑定(bind)参数替换列名是不可能的。 这是 JDBC 的限制,甚至可能是 SQL 的限制。
您可以做的是使用一个表达式,该表达式根据绑定(bind)参数计算不同列的值。 有点像
... ORDER BY CASE
WHEN :orderColumn = 'created' THEN created
WHEN :orderColumn = 'updated' THEN updated
WHEN :orderColumn = 'deleted' THEN deleted
ELSE 1
END;
请注意,查询优化器无法很好地支持这种构造方式,因此不会使用任何原本适用的索引。
如果您需要优化器提供更好的支持,您始终可以编写动态创建的自定义查询。 如果您决定这样做,请确保您没有将来自不受信任来源的字符串合并到您的 SQL 语句中,以避免 SQL 注入(inject)漏洞。
关于java - spring-data-jdbc 中的参数化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60361743/