我遇到了使用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:我正在使用休眠。
编辑:只是为了澄清,我知道我可以有一个没有限制条款的第二种方法。我只想知道我想要的是什么。
答案 0 :(得分:0)
将@Param("size") String size
更改为@Param("size") Long size
并为此创建另一种方法。
如果您在查询中使用LIMIT
,则可能需要限制结果集。如果您不想在没有分页的情况下限制使用findBy...
,请在服务层内进行数学运算。
这将使您的代码清洁。
答案 1 :(得分:0)
LIMIT NULL
也会检索所有数据。
您可以在NULLIF
后尝试LIMIT
。因此,如果您的限制值为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