postgresql - 通过计算不同的列值来限制查询

标签 postgresql hibernate limit

我有一 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 ,但恕我直言,这是一个小的权衡。

更多信息 herehere .

关于postgresql - 通过计算不同的列值来限制查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45750740/

相关文章:

java - JPA2 元模型生成器不会从依赖库生成模型

ipad - ipad应用程序有大小限制吗?

php - 如何限制从数据库回显的字符?

python - Pygame- 创建更多 USEREVENT 类型事件的方法?

sql - 未经许可使用表的PostgreSQL查询

php - 我的数据库连接没有连接到 postgreSQL

multithreading - PostgreSQL:在恶劣的多用户环境中使用 SELECT nextval 生成器线程安全吗?

sql - 在 Hibernate SQL 查询中你如何转义?字段名称中的字符

ruby-on-rails - 使用正则表达式的高级 Active Record 顺序

java - View 、DAO、服务和 Controller 的基本 Hibernate 和 Spring MVC 集成