【问题标题】:Use LIMIT with Spring Data and Postgres将 LIMIT 与 Spring Data 和 Postgres 一起使用
【发布时间】:2018-07-02 04:35:16
【问题描述】:

我遇到了使用 Spring Data(本机查询)和 Postgres 限制查询结果的问题。

在 Postgres 中,可以将 LIMIT 关键字与整数(LIMIT 50 用于获取前 50 个结果)或字符串(LIMIT ALL 以获取所有结果)一起使用。我正在尝试使用处理这两种情况的相同查询。

@Query(value = "SELECT * 
FROM tableA 
WHERE columnA = :value 
LIMIT :size", nativeQuery = true)
TableA findByColumnA(@Param("columnA") String columnA, @Param("size") String size);

问题是我遇到了这个异常:

Caused by: org.postgresql.util.PSQLException: ERROR: argument of LIMIT must be type bigint, not type character varying

我理解错误,如果我将变量大小的类型更改为 int,则查询没有问题,但我无法将值“ALL”传递给查询。

有人有在限制子句中使用字符串的解决方案吗?

PS:我正在使用休眠。

编辑:澄清一下,我知道我可以有第二种方法,而无需限制子句。我只是想知道我想要的是否可行。

【问题讨论】:

  • 您必须围绕它进行设计,例如通过传递Integer.MAX_VALUE 而不是ALL。虽然我会说拥有LIMIT 的整个想法是可疑的设计。
  • 我不同意传递 MAX_VALUE。这只是一个隐藏核心问题的“随机”数字。为什么这是一个可疑的设计?
  • Integer.MAX_VALUE 没有什么随机,相反,它甚至在不同的计算机体系结构中都是一致的。但是,从设计上讲,我会说让调用者通过自定义限制不是调用者应该做的事情。特别是因为您甚至没有尝试进行分页,因为没有偏移量。
  • 我们正在讨论一个用于批处理的查询,因此我对查询有限制是有道理的。唯一值得怀疑的是它应该是一个查询还是两个查询(一个带有限制子句,另一个没有它)。

标签: java spring postgresql hibernate spring-data


【解决方案1】:

LIMIT NULL 也将检索所有数据。

您可以在LIMIT 之后尝试NULLIF。因此,如果您的限制值为null,您可以将值-1 作为参数发送。例如:

@Query(value = "SELECT * 
FROM tableA 
WHERE columnA = :value 
LIMIT NULLIF(:size, -1)", nativeQuery = true)
TableA findByColumnA(@Param("columnA") String columnA, @Param("size") Integer size);

还有:

Integer limit = param == null ? -1 : param;    
findByColumnA("string", limit)

文档:https://www.postgresql.org/docs/9.5/static/functions-conditional.html#FUNCTIONS-NULLIF

【讨论】:

    【解决方案2】:

    @Param("size") String size 更改为@Param("size") Long size 并为此创建另一个方法。

    如果您在查询中使用LIMIT,您可能希望限制结果集。如果您不想限制使用 findBy... 而不进行分页并在您的服务层内进行数学运算。

    这将使您的代码干净。

    【讨论】:

    • 感谢您的回答,但目前我已经实现了您所说的。我想知道是否可以按照我的描述进行。
    猜你喜欢
    • 2019-05-30
    • 2014-03-10
    • 2014-10-21
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多