3

我正在努力使订单参数化。最好的就是拥有

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

4

3 回答 3

2

无法用绑定参数替换列名。这是 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 注入漏洞。

于 2020-02-24T06:44:45.773 回答
2

使用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());

总结例子,你可以在这里很好

于 2020-02-23T11:45:07.673 回答
0

直到有版本spring-data-jdbc(据我所知 2.XXRELEASE)支持 Pagable 对象之前,我已经决定在这种特殊情况下使用NamedParameterJdbcTemplate并跟踪我自己的查询。我希望这里的这个或其他答案会对某人有所帮助。谢谢您的帮助 :)

于 2020-03-13T10:37:00.770 回答