【问题标题】: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】:
假设您使用Sping 和Spring-data,您可以使用投影以避免维护自定义查询。考虑以下示例:
- 实体类
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<>();
}
- 投影界面:
public interface BookNameAuthorOnly {
String getName();
String getAuthor();
}
- 存储库方法:
@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();
}