【发布时间】: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