Spring Data Jpa Repository findBy Part of Data not by doing all cases

Spring Data Jpa Repository findBy Part of Data not by doing all cases

我找不到类似的问题,所以我 post 这个问题。 我很高兴被链接到我遇到的类似问题。

我的 Spring 服务器从 UI 客户端获取部分 3 数据,并将适当的数据提供给在数据库中找到的 UI 客户端。 我必须为它分别识别和执行 findby~ 函数。

在项目服务中

public List<Project> getProjectsByPartialData(ProjectDto projectDto) {
    if (projectDto.getYearCodeName()!= null && projectDto.getCustomerCoName() != null && projectDto.getSeasonCodeName()!=null) {
        return projectRepository.findByYearCodeNameAndCustomerCoNameAndSeasonCodeName(projectDto.getYearCodeName(),projectDto.getCustomerCoName(),projectDto.getSeasonCodeName());
    } else if (projectDto.getYearCodeName() == null && projectDto.getCustomerCoName() != null && projectDto.getSeasonCodeName()!=null) {
        return projectRepository.findByCustomerCoNameAndSeasonCodeName(projectDto.getCustomerCoName(),projectDto.getSeasonCodeName());
    } else if (projectDto.getYearCodeName()!= null && projectDto.getCustomerCoName() == null && projectDto.getSeasonCodeName()!=null) {
        return projectRepository.findByYearCodeNameAndSeasonCodeName(projectDto.getYearCodeName(),projectDto.getSeasonCodeName());
    } else if (projectDto.getYearCodeName()!= null && projectDto.getCustomerCoName() != null && projectDto.getSeasonCodeName()==null) {
        return projectRepository.findByYearCodeNameAndCustomerCoName(projectDto.getYearCodeName(),projectDto.getCustomerCoName());
    } ...3 more to go
}

有什么简单的方法可以做到这一点吗?


额外

在项目中

@Entity
@Getter
@NoArgsConstructor
@ToString
@EqualsAndHashCode
public class Project {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "YEAR_CODE", referencedColumnName = "CODE")
    private YearCode yearCode;

    @ManyToOne
    @JoinColumn(name = "CUSTOMER_CO_CODE", referencedColumnName = "CODE")
    private CustomerCo customerCo;

    @ManyToOne
    @JoinColumn(name = "SEASON_CODE", referencedColumnName = "CODE")
    private SeasonCode seasonCode;

    ... other properties
}

在 ProjectDto

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
public class ProjectDto {

    private String yearCodeName;

    @JsonProperty(value = "customerNameCode")
    private String customerCoName;

    private String seasonCodeName;
    ... other properties
}

您不必对每个案例都使用 findBy... 方法。 Spring 数据有特殊的 Specification 接口来定义可重用谓词。只需从此接口实现 toPredicate(..) 方法并将您的实现用作存储库方法中的参数:

List<Project> findAll(Specification spec);

查看更多:

Spring Data Specifications and Querydsl

REST Query Language with Spring Data JPA Specifications