【问题标题】:Spring JPA Query returns Null instead of ListSpring JPA Query 返回 Null 而不是 List
【发布时间】:2016-05-04 21:27:59
【问题描述】:

我有一个 @Entity VideoList<Tag> tags 作为其字段之一的 一对多 关系。我使用以下@Repository 使用 Spring Data 来获取最受欢迎的标签:

@Repository
public interface TagRepository extends CrudRepository<Tag, Integer>{
    @Query("SELECT t FROM Tag t WHERE (SELECT SUM(v.views) FROM Video v WHERE t MEMBER OF v.tags) > 0")
    public List<Tag> findMostViewedTags(int maxTags);
}

QuerySpring 处理并认为是有效的,我在本地测试了生成的 SQL 与我的数据库,它返回了 2 标签。然而,在我的代码中,当我调用 findMostViewedTags(100) 方法时,我收到了值 Null

查询查找策略是默认的“CREATE_IF_NOT_FOUND”。

  1. 如果没有找到结果,该方法应该返回一个空列表还是Null?我想要的行为是收到一个空列表。
  2. 为什么方法调用返回 Null 而不是 size() 2 的 List&lt;Tag&gt;

【问题讨论】:

  • maxTags 未使用,或者这不是您实际执行的查询。

标签: java spring jpa spring-data spring-data-jpa


【解决方案1】:
  1. 如果没有找到结果,正常行为确实会返回一个空列表。如果 List&lt;Object&gt; 是定义接口中方法的返回值,则该方法永远不应返回 Null
  2. 问题是为方法提供了一个参数,而该参数并未在查询中的任何地方使用。出于某种原因,Spring 决定在这种情况下返回一个 Null。解决方法:去掉未使用的参数或者使用Query中的参数。

【讨论】:

  • “解决方案”应该包括在 Spring 上提出一个错误以更好地满足这种情况
  • @Vjeetje 是否在文档中的任何位置指定如果未找到结果则返回空列表?我找不到它
  • @osmingo 给你..docs.spring.io/spring-data/jpa/docs/current/reference/html/…Repository methods returning collections, collection alternatives, wrappers, and streams are guaranteed never to return null but rather the corresponding empty representation
【解决方案2】:

我遇到过类似的问题。原因是我使用的是 Mockito 并且没有正确地使用 when() 模拟数据。

【讨论】:

    猜你喜欢
    • 2018-02-26
    • 2018-08-08
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2021-04-19
    • 2018-07-15
    相关资源
    最近更新 更多