java - Spring JpaRepositor返回选定的pojo字段

标签 java spring spring-data-jpa

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

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

我需要仅返回选定的字段。

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

如果有任何关于如何执行此操作的建议或示例,我将不胜感激。我能想到的最简单的方法是动态创建查询,但在这种情况下,PagingAndSortingRepository 接口(interface)看不到它。

我需要维护分页和排序功能。

最佳答案

固定集解决方案:

如果您有预定义的组合属性集(例如,为一个用例组合 field1field3field20,并为另一个用例返回 field4field8),您可以使用多个 @JsonView 注释来注释 POJO(请参阅 http://www.baeldung.com/jackson-json-view-annotation 以获取详细说明)。

根据您需要的字段集,您可以根据用户请求的“集”在 Controller 中使用正确的 View 。

动态集解决方案1: 如果您实际上希望资源返回字段的任何随机组合(事先不知道),JsonView 不会剪切它。

您可以改为添加一个自定义 BeanPropertyWriter 或自定义序列化程序,它只是跳过(不调用 jsonGen.writeXXX)未请求的属性。这里的困难在于让编写器/序列化器(由 Spring 的 Jackson 消息转换器调用)知道所请求的属性(传递到 REST Controller )。不能 100% 确定这可能如何工作,但这将允许您使用相同的 POJO。

动态集解决方案2:

有点乏味:您可以使用 commons-beanutils 将 POJO 转换为 Map,而不是仅仅从 Controller 返回 POJO。这样,您将获得 POJO 的扁平化表示。接下来,您可以从 map 中删除不属于“请求字段”列表的键,然后返回 map (或列表/页面)并让 Jackon 发挥它的魔力。

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

这可以应用于任何类型的对象,因此在基础资源或可以稍微隐藏繁重工作的东西中提取此行为。

关于java - Spring JpaRepositor返回选定的pojo字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47209647/

相关文章:

azure - 如何使用 spring-data-cosmosdb 设置 CosmosDB 中整个数据库的吞吐量(RU)?

Java/IntelliJ 无法识别 Dagger2 组件的 "Dagger"关键字

java - 在 Java Swing 中用图案填充矩形

java - 将类路径添加到 netbeans maven 项目

java - 在 Thymeleaf 中根据特定条件使图像可点击

java - 使用 Spring MVC 在 REST HTTP GET 请求中传递 JSON 对象

spring - 如何从Spring Webflux Controller 捕获异常?

java - 将 C 代码转换为 Java 代码 :sscanf

hibernate - Spring MVC 中的 JPA Hibernate 批量/批量更新

java - spring security 未调用 loadUserByUsername() 方法