我有一 table 人,像这样:
ID PersonId SomeAttribute
1 1 yellow
2 1 red
3 2 yellow
4 3 green
5 3 black
6 3 purple
7 4 white
之前,我将所有人员作为单独的对象返回给 API。因此,如果用户将限制设置为 3,我只是将 hibernate 中的查询 maxResults 设置为 3 并返回:
{"PersonID": 1, "attr":"yellow"}
{"PersonID": 1, "attr":"red"}
{"PersonID": 2, "attr":"yellow"}
如果有人指定限制为 3 和第 2 页(setMaxResult(3),setFirstResult(6),它将是:
{"PersonID": 3, "attr":"green"}
{"PersonID": 3, "attr":"black"}
{"PersonID": 3, "attr":"purple"}
但现在我想选择人,然后组合成一个 json 对象,如下所示:
{
"PersonID":3,
"attrs": [
{"attr":"green"},
{"attr":"black"},
{"attr":"purple"}
]
}
这就是问题所在。在 postgresql 或 hibernate 中是否有可能不是按行数而是按不同人员 ID 的数量来设置限制,因为如果用户将限制指定为 4,我应该返回 person1、2、3 和 4,但在我当前的限制机制中我会返回具有 2 个属性的 person1,返回只有一个属性的 person2 和 person3。分页也有同样的问题,现在我可以在一页上返回 person3 数组属性的一半,在下一页返回另一半。
最佳答案
您可以使用 row_number模拟LIMIT
:
-- Test data
CREATE TABLE person AS
WITH tmp ("ID", "PersonId", "SomeAttribute") AS (
VALUES
(1, 1, 'yellow'::TEXT),
(2, 1, 'red'),
(3, 2, 'yellow'),
(4, 3, 'green'),
(5, 3, 'black'),
(6, 3, 'purple'),
(7, 4, 'white')
)
SELECT * FROM tmp;
-- Returning as a normal column (limit by someAttribute size)
SELECT * FROM (
select
"PersonId",
"SomeAttribute",
row_number() OVER(PARTITION BY "PersonId" ORDER BY "PersonId") AS rownum
from
person) as tmp
WHERE rownum <= 3;
-- Returning as a normal column (overall limit)
SELECT * FROM (
select
"PersonId",
"SomeAttribute",
row_number() OVER(ORDER BY "PersonId") AS rownum
from
person) as tmp
WHERE rownum <= 4;
-- Returning as a JSON column (limit by someAttribute size)
SELECT "PersonId", json_object_agg('color', "SomeAttribute") AS attributes FROM (
select
"PersonId",
"SomeAttribute",
row_number() OVER(PARTITION BY "PersonId" ORDER BY "PersonId") AS rownum
from
person) as tmp
WHERE rownum <= 3 GROUP BY "PersonId";
-- Returning as a JSON column (limit by person)
SELECT "PersonId", json_object_agg('color', "SomeAttribute") AS attributes FROM (
select
"PersonId",
"SomeAttribute"
from
person) as tmp
GROUP BY "PersonId"
LIMIT 4;
当然,在这种情况下,您必须使用 native query ,但恕我直言,这是一个小的权衡。
关于postgresql - 通过计算不同的列值来限制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750740/