Spring 数据 JPA 获取列表总是 returns 至少一个结果
Spring Data JPA fetching list always returns at least a single result
我注意到我的 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")
我的实际查询更大,这包含解释问题所在的所有必要内容。此查询将 return 一个列表,但假设该位置不存在,它应该 return null 或一个空列表,对吗?哦,你错了,我可爱的夏天child!
此查询将始终 return 包含至少一个元素的列表,无论是否有任何帖子链接到所述位置。
[{"id": null, "likes": 0}]
这就是序列化为 JSON 时的结果。我不太确定如何处理这个小困境,因为我显然不想 return 一个包含错误数据的列表,但需要使用处理来过滤掉无用数据似乎也很愚蠢和不必要。
有什么办法可以防止我还没有找到这种情况吗?如果它有任何相关性,我目前正在使用预测来回答我的问题。
到目前为止我尝试过的:
- 为字段添加非空条件。不起作用,被 COUNT 忽略。
- 为所有字段添加约束@NotNull。不行,还是会变成null。
- 为了它的价值,我尝试了不同类型的连接,尽管除了 LEFT JOIN 之外的任何连接都没有多大意义。
我也找不到任何其他类似的案例,尽管它很可能存在,但被其他一切淹没了。我不太确定在这方面可以做些什么,所以我很好奇这是否只是框架的一个怪癖,或者是否有实际的解决方案。
也许可以通过本机查询来解决,但我不想使用它们。
我不是 SQL 专家,但我相信如果 ID 不存在,左连接会给你这个结果。
您 运行 数据库中有查询吗?它不会在结果集中为您提供一行不存在的 ID 吗?
我相信这是想说有一个 0 匹配。
您可能希望在 运行 查询之前验证您的查询。意思是先检查位置是否存在。
由于问题本质上是由于我的真实查询中的 COUNT 和 CASE 关键字导致的,导致总是至少有一行,而且我找不到任何自动执行此操作的方法,我的解决方案使用的是以下内容:
List<Item> items = repository.customQuery(id);
if (0 < items.size() && null == items.get(0).getId()) {
items.remove(0);
}
第一个条件是任意的,因为我知道总是至少有一个条目,但这只是作为一项安全措施。 try-catch 块也可以解决这个问题。在使用原始 int 而不是 Integer 的情况下,您需要将构造函数中的值初始化为通常不会出现在数据库中的值,例如 -1.
如果有人知道更好的方法,我很想知道。
我注意到我的 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")
我的实际查询更大,这包含解释问题所在的所有必要内容。此查询将 return 一个列表,但假设该位置不存在,它应该 return null 或一个空列表,对吗?哦,你错了,我可爱的夏天child! 此查询将始终 return 包含至少一个元素的列表,无论是否有任何帖子链接到所述位置。
[{"id": null, "likes": 0}]
这就是序列化为 JSON 时的结果。我不太确定如何处理这个小困境,因为我显然不想 return 一个包含错误数据的列表,但需要使用处理来过滤掉无用数据似乎也很愚蠢和不必要。 有什么办法可以防止我还没有找到这种情况吗?如果它有任何相关性,我目前正在使用预测来回答我的问题。
到目前为止我尝试过的:
- 为字段添加非空条件。不起作用,被 COUNT 忽略。
- 为所有字段添加约束@NotNull。不行,还是会变成null。
- 为了它的价值,我尝试了不同类型的连接,尽管除了 LEFT JOIN 之外的任何连接都没有多大意义。
我也找不到任何其他类似的案例,尽管它很可能存在,但被其他一切淹没了。我不太确定在这方面可以做些什么,所以我很好奇这是否只是框架的一个怪癖,或者是否有实际的解决方案。
也许可以通过本机查询来解决,但我不想使用它们。
我不是 SQL 专家,但我相信如果 ID 不存在,左连接会给你这个结果。 您 运行 数据库中有查询吗?它不会在结果集中为您提供一行不存在的 ID 吗?
我相信这是想说有一个 0 匹配。
您可能希望在 运行 查询之前验证您的查询。意思是先检查位置是否存在。
由于问题本质上是由于我的真实查询中的 COUNT 和 CASE 关键字导致的,导致总是至少有一行,而且我找不到任何自动执行此操作的方法,我的解决方案使用的是以下内容:
List<Item> items = repository.customQuery(id);
if (0 < items.size() && null == items.get(0).getId()) {
items.remove(0);
}
第一个条件是任意的,因为我知道总是至少有一个条目,但这只是作为一项安全措施。 try-catch 块也可以解决这个问题。在使用原始 int 而不是 Integer 的情况下,您需要将构造函数中的值初始化为通常不会出现在数据库中的值,例如 -1.
如果有人知道更好的方法,我很想知道。