java - spring-data-jdbc 中的参数化顺序

标签 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 版本。即使只是为列名做这件事也会对我有很大帮助。

最佳答案

用绑定(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/

相关文章:

java - Liferay Portal-ext LDAP 配置

java - 如何使用 Guice 注入(inject) RequestParameters

java - spring-data-jdbc deleteBy<field> 方法返回异常结果类型

spring-data-jdbc - 如何在 spring-data-jdbc 中指定表模式

java - 在 Eclipse RCP 中使用导航历史记录

java - 当我在 Wildfly 上重新部署 war 时出现 404 错误

java - 使用 spring-data-jdbc 进行审计?

java - Spring Data JDBC @Modifying 与 PostgreSQL RETURNING 从修改的行返回数据

java - 如何使用 Spring Data JDBC 处理复合键

java - 如何从 servlet 获取下拉列表的 Selected INDEX?