首页 > 解决方案 > Spring repo 中的“ID 不在结果集中”错误,但在 PGA 中有效

问题描述

我得到了一个非常基本的查询,它获得了前 10 个搜索词:

select distinct keyword, sum (amount) as keyword_amount from search group by keyword order by keyword_amount DESC

这在 PostGresAdmin 4 中运行良好,我获得了前 10 名。但是当我想通过端点上的 Postman 在 Spring 上对其进行测试时,它不断给我 500 个错误。它说没有找到 ID 和/或应该在 group by 或在聚合函数中使用。我在其他主题中发现我需要使用“distinct”或将 ID 放在 min/max(?) 中。仍然没有成功,更奇怪的是它确实在 PostGreSQL 本身中工作。

我试过了:

@Query( value = "select distinct keyword, sum (amount) as keyword_amount from search " +
        "group by keyword order by keyword_amount DESC",
        nativeQuery = true
)
List<Search> findTop10Keywords();

这给了我丢失的 ID 错误,我尝试不使用 nativeQuery,但后来我得到:

search is not mapped [select distinct keyword, sum (amount) as keyword_amount from search group by keyword order by keyword_amount DESC

我不确定为什么/在哪里必须映射搜索?

标签: springpostgresql

解决方案


SELECT keyword, sum(amount) AS keyword_amount
FROM   "search"  -- ?
GROUP  BY keyword
ORDER  BY keyword_amount DESC NULLS LAST
LIMIT  10;

既然你已经GROUP BY keyword,添加distinct是一个昂贵的无操作。去掉它。

sum(amount)可能为 NULL。如果可能发生这种情况(取决于未公开的细节),请务必使用ORDER BY keyword_amount DESC NULLS LAST. 看:

似乎可以安全地假设调用的查询indTop10Keywords应该只返回前 10 个。所以LIMIT 10

“搜索”是标准 SQL 中的保留字(即使在 Postgres 中允许作为标识符)。也许这就是春天的错觉。双引号可能会有所帮助。但我宁愿避免使用保留字作为标识符。


推荐阅读