【问题标题】:How to add a specific field in Spring Data Rest?如何在 Spring Data Rest 中添加特定字段?
【发布时间】:2017-08-13 03:46:03
【问题描述】:

我正在使用 Spring Data Rest 开发 Web 服务。

public interface BookRepository extends PagingAndSortingRepository<Book, Long> {

    @Override
    @Query("select avg(rl.rating) as rating, b from ReadingList rl join rl.book b group by rl.book order by rating desc")
    Page<Book> findAll(Pageable pageable);
}

当我如上所述在 JPQL 中选择时,'avg (rl.rating) as rating' 列没有如下图所示的名称。

enter image description here

评分:4.0
我想做这项服务。

另外,完整源码在github。 https://github.com/ohgamja3/readinglist-rest-server/

我需要有关此问题的帮助。 感谢阅读。

【问题讨论】:

    标签: spring-data-jpa spring-data-rest


    【解决方案1】:

    您可以在 repo 方法的输出中使用projection

    1. 因此,在您的情况下,您可以设置投影,例如:
    @Projection(name = "BookWithRating", types = { Book.class }) 
    interface BookWithRating { 
    
      Float getRating(); 
    
      Book getBook(); 
    }
    
    1. 然后设置查询方法:
    @Query("select avg(rl.rating) as rating, b as book from ReadingList rl join rl.book b group by rl.book order by rating desc")
    Page<BookWithRating> findAllWithRating(Pageable pageable);
    

    注意输出参数的别名 - 它们的名称必须与投影 getter 匹配。

    您还可以尝试使用 this 技术来丰富数据模型(请参阅如何“使用 SpEL 表达式使用 @Value 注释公开的属性以公开合成属性”)。

    【讨论】:

    • 非常感谢您的回复。但是,当如上应用@Projection 时,启动时会发生异常。嵌套异常是 java.lang.IllegalArgumentException: Not a managed type: interface readinglist.BookWithRating
    • 我已经更新了我的答案。当然,我们不能使用 'findAll' фы 查询方法的名称和 Page 作为输出。您还使用“浮动”类型作为“评级”,所以我在投影中更改它。您可以找到一个有效的投影示例here
    • 非常感谢。感谢您的帮助。
    猜你喜欢
    • 2015-12-31
    • 2017-11-14
    • 1970-01-01
    • 2018-03-31
    • 2018-06-08
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多