Spring JpaRepositort返回选定的pojo字段

时间:2017-11-09 19:03:13

标签: java spring spring-data-jpa

我有一个包含30个字段的实体。

目前,我使用PagingAndSortingRepository提供findAllfindAllBy ...休息过滤服务。这将返回所有30个字段。

我要求只返回选定的字段。

例如,用户选择field1field5field11field25,服务应返回仅包含这4个字段的json。

我很感激有关如何执行此操作的任何建议或示例。我能想到的最简单的方法是动态创建查询,但在这种情况下,PagingAndSortingRepository界面无法看到它。

我需要保持分页和排序功能。

1 个答案:

答案 0 :(得分:0)

固定设置解决方案:

如果您有一个预定义的组合属性集(例如,将field1field3field20合并为一个用例,并返回field4field8另一个用例)你可以通过多个@JsonView注释来注释你的POJO(请参阅http://www.baeldung.com/jackson-json-view-annotation以获得更好的解释)。

根据您需要的字段集,您可以根据用户请求的“设置”在控制器中使用正确的视图。

动态设置解决方案1: 如果您确实希望资源返回任何随机组合(事先未知),JsonView将不会删除它。

您可以添加一个自定义BeanPropertyWriter或自定义序列化程序,它只是跳过(不会调用jsonGen.writeXXX)以查找未请求的属性。这里的难点是获取所请求的属性(传入您的REST控制器)在编写器/序列化器中已知,这是由Spring的Jackson消息转换器调用的。不是100%确定这可能如何工作,但这将允许您使用相同的POJO。

动态设置解决方案2:

有点单调乏味:您可以使用commons-beanutils将POJO转换为Map,而不是仅仅从控制器返回POJO。这样,您就可以展示您的POJO。接下来,您可以从地图中删除键,这些键不属于“请求的字段”列表,并返回Map(或列表/页面),让Jackon知道它的魔力。

这将导致与POJO本身生成的JSON相同,如果您没有使用高级JSON *注释我猜...

这可以应用于任何类型的Object,因此在基础资源中提取此行为或者某些东西可以隐藏繁重的东西。