将LIMIT与Spring Data和Postgres一起使用

时间:2018-01-23 11:14:00

标签: java spring postgresql hibernate spring-data

我遇到了使用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:我正在使用休眠。

编辑:只是为了澄清,我知道我可以有一个没有限制条款的第二种方法。我只想知道我想要的是什么。

2 个答案:

答案 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