【问题标题】:Spring- How to remove a property from a list of Objects?Spring-如何从对象列表中删除属性?
【发布时间】:2019-01-31 14:39:50
【问题描述】:

我有一个实体“人”,它具有以下属性,

Id
Name
F-Name
Age
Address

当我在 Person 上调用存储库函数 findAll() 时,它会返回一个 Person 列表。

List<Person> list = somefuntionToConvertIterableToList(personRepository.findAll());

这个列表有多个 Person 类型的对象。

Person ...... Id1,Name1, F-Name1, Age1, Address1

Person .......IdN,NameN, F-NameN, AgeN, AddressN

我需要从所有 Persons 中删除“Id”,我该怎么办?

我知道我们可以使用“remove”来删除列表中的元素,但是如何删除元素中的属性呢?

【问题讨论】:

  • 请解释你为什么要这样做?
  • 我需要把这个数据传给ResponseEntity给客户端,显然“Id”对客户端没有用。
  • 为什么不为此创建一个 DTO?
  • 您不能“删除”属性!使用 DTO 或类似的方法返回数据的自定义视图,例如 Spring data Projections docs.spring.io/spring-data/jpa/docs/current/reference/html/… 或 JsonView baeldung.com/jackson-json-view-annotation
  • 如果它的传出可能杰克逊 @JsonIgnore 有帮助。如果它的内部创建一个附加类,该类具有除 id 之外的所有属性并从 person 构造它。

标签: spring spring-boot jpa collections


【解决方案1】:

我认为您需要使用:@JsonIgnore in Id 看起来像:

@JsonIgnore
   Field you want remove in reponse.

或者你可以创建 DTO 并把你想要返回的所有字段看起来像:

  public class PersonDTO {
      //all field you want return
   }

【讨论】:

    【解决方案2】:

    您当然可以将id 设置为null 或在序列化中添加忽略,但也许您根本不想加载id。通常您会使用DTOTuple 来决定要填充哪些字段。所以不要先填充所有然后删除不需要的(我没有使用你的Person,只是一个简化的示例类)。

    您的存储库中的元组查询就像 (JPQL):

    @Query("SELECT te.name AS name, te.created as created FROM TestEntity te")
    List<Tuple> findAllTuple();
    

    这将需要做额外的工作以使元组在序列化时与原始实体相对应。所以最好用DTO,比如:

    // This class would be exactly as your Person but without that id
    @AllArgsConstructor // you need the constructor for new in jpql
    public class TestEntityDto {
        private String name;
        private LocalDateTime created;
    }
    

    而您的存储库中的查询类似于:

    @Query("SELECT NEW org.example.data.entity.dto.TestEntityDto(te.name, te.created) FROM TestEntity te")
    List<TestEntityDto> findAllDto();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多