【问题标题】:Spring Ignore field just in getAll methodSpring Ignore field just in getAll 方法
【发布时间】:2021-09-02 04:36:46
【问题描述】:

我在 DB 中有一个人员列表,每个人都有一个 CV 字段,它是 Spring 中的 MultiPart 文件。我试图从 db 中获取所有人,但忽略 CV 字段,因为我不想在使用 getAllPersons 函数时被下载。我看到了 JsonIgnore 的可能性,但我只想在 getAllPersons 中忽略该字段,而不是在 getPersonById 等其他函数中。我该怎么做?

【问题讨论】:

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


    【解决方案1】:

    为此,您可以使用 HQL。

    interface Repo extends C... {
         @Query(select h.name, h.phone, ... from Person h)
         List<Person> getAllPerson();
    }
    

    【讨论】:

      【解决方案2】:

      假设您使用SpingSpring-data,您可以使用投影以避免维护自定义查询。考虑以下示例:

      1. 实体类Book
      @Data
      @Entity
      @Table(name = "book")
      public class Book {
      
          @Id
          @GeneratedValue(generator = "book_sequence", strategy = GenerationType.SEQUENCE)
          @SequenceGenerator(name = "book_sequence", sequenceName = "book_sequence", allocationSize = 1)
          private Long id;
      
          @NaturalId
          private String name;
      
          private String author;
      
          private String publisher;
      
          private String plot;
      
          @ManyToMany(mappedBy = "books")
          @ToString.Exclude
          @EqualsAndHashCode.Exclude
          private Set<BookFilter> filters = new HashSet<>();
      
      }
      
      1. 投影界面:
      public interface BookNameAuthorOnly {
      
          String getName();
          String getAuthor();
      
      }
      
      1. 存储库方法:
      @Repository
      public interface BookRepository extends JpaRepository<Book, Long> {
      
          List<BookNameAuthorOnly> findBy();
      
      }
      

      当调用后者时,Spring 生成的动态查询将仅选择您在相关interface 对象中指定的字段。有关这方面的更多信息,您可以查看以下文档:

      https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

      不知道这是否适合您的用例场景,但这也是实现您需要实现的目标的另一种方式。

      【讨论】:

        【解决方案3】:

        您也可以使用DTO,如下例所示:

        个人实体:

        import javax.persistence.Entity;
        import javax.persistence.Id;
        import javax.persistence.Lob;
        
        import lombok.Getter;
        import lombok.NoArgsConstructor;
        import lombok.Setter;
        
        @Getter
        @Setter
        @NoArgsConstructor
        @Entity
        public class Person {
            @Id
            private long id;
            private String name;
            private String address;
            @Lob
            private Object cvFields;
        }
        

        PersonDTO:

        package com.example.dto;
        
        import lombok.Getter;
        import lombok.NoArgsConstructor;
        import lombok.Setter;
        
        @Getter
        @Setter
        @NoArgsConstructor
        public class PersonDTO {
            private long id;
            private String name;
            private String address;
        
            public PersonDTO(Person person) {
                this.id = person.getId();
                this.name = person.getName();
                this.address = person.getAddress();
            }
        }
        

        PersonRepository:

        import java.util.List;
        
        import org.springframework.data.jpa.repository.JpaRepository;
        import org.springframework.data.jpa.repository.Query;
        
        public interface PersonRepository extends JpaRepository<Person, Long> {
        
            @Query("SELECT new com.example.dto.PersonDTO(p) FROM Person p")
            List<PersonDTO> getAll();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 2022-12-01
          • 2011-01-21
          • 2022-08-16
          • 1970-01-01
          • 1970-01-01
          • 2011-04-13
          相关资源
          最近更新 更多