【发布时间】:2021-10-08 05:01:08
【问题描述】:
我注意到我的 API 在我使用 Spring Data JPA 时的工作方式存在一个小问题。 我的查询看起来是这样的:
@Query("SELECT p.id AS id, COUNT(l) AS likes FROM Post p LEFT JOIN Like l ON l.post = p WHERE p.location.id = ?1")
我的实际查询更大,这包含解释问题所在的所有必要内容。此查询将返回一个列表,但假设该位置不存在,它应该返回 null 或空列表,对吗?哦,你错了,我可爱的夏天的孩子! 此查询将始终返回至少包含一个元素的列表,无论是否有任何帖子链接到所述位置。
[{"id": null, "likes": 0}]
这就是序列化为 JSON 时的结果。我不太确定如何处理这个小困境,因为我显然不想返回包含错误数据的列表,但是需要使用处理来过滤掉垃圾似乎也很愚蠢和不必要。 有什么方法可以防止这种我还没有找到吗?如果有任何相关性,我目前正在使用预测作为我的回复。
到目前为止我已经尝试过:
- 为字段添加非空条件。不起作用,被 COUNT 忽略。
- 向所有字段@NotNull 添加约束。不起作用,仍然会变为 null。
- 不管怎样,我尝试了不同类型的连接,但除了 LEFT JOIN 之外的任何连接都没有多大意义。
我也找不到任何其他类似的情况,尽管它很可能存在,但被其他所有情况淹没了。我不太确定在这方面可以做些什么,所以我很好奇这是否只是框架的一个怪癖,或者是否有实际的解决方案。
也许可以通过原生查询来解决,但我不想使用它们。
【问题讨论】:
-
COUNT(l)是造成您麻烦的原因。如果它没有找到任何东西,它将按预期计为 0。一种选择是简单地获取后端列表的大小。 -
@JettoMartínez 更简单的方法是检查第一行是否有空 ID,这正是我现在所倾向于的。这将是一个可靠的解决方案,就好像第一个条目的 ID 为空一样,除非存在格式错误的查询,否则不会有后续行,因为 ID 是主键。遗憾的是,您建议的解决方案也不起作用,因为我的实际查询中也有一个 CASE,尽管它遇到与 COUNT 相同的问题,所以我觉得这没什么大不了的。问题是我需要三个单独的查询才能获得一组结果,这感觉效率很低。
标签: spring jpa spring-data-jpa jpql spring-projections