gpt4 book ai didi

java - 是否可以在 Spring Boot 中在运行时构建自定义查询?

转载 作者:行者123 更新时间:2023-11-30 07:59:48 24 4
gpt4 key购买 nike

这就是我想要做的,

我有一个实体,

@Entity
public class JobEntity {

@Id
@GeneratedValue
private Long id;

@Enumerated(EnumType.STRING)
private Project project;

@Enumerated(EnumType.STRING)
private JobType jobType;

@Enumerated(EnumType.STRING)
private JobStatus jobStatus;

private Date createTime;
}

我知道我可以在存储库中自定义一个查询,但那只是一个固定查询。我希望导出一些 RESTful api,如下所示,

/search?project=""&jobType=""&jobStatue=""&createTime=""

这些参数不应该是强制要求的,并且可以很容易地使用它们中的任何一个来进行查询,比如

/search?createTime=""...

有没有一种优雅的方式来实现这个?

最佳答案

您可以使用 Spring 的规范 API,它是 JPA 标准 API 的包装器。确保您的存储库扩展自 JpaSpecificationExecutor<JobEntity>

一个示例规范是:

public class JobEntitySpecifications {
public static Specification<JobEntity> withProject(Project project) {
if (project == null) {
return null;
} else {
return (root, query, cb) -> cb.equal(root.get("project"), project);
}
}

public static Specification<JobEntity> withJobType() { ... }
public static Specification<JobEntity> withJobStatus() { ... }
public static Specification<JobEntity> withCreateTime() { ... }
}

确保返回 null当没有给出项目代码/工作类型/...时,它将在您的查询中被忽略。

现在你可以使用它了:

repository.findAll(Specifications.where(JobEntitySpecifications.withJobType(jobType))
.and(JobEntitySpecifications.withJobStatus(jobStatus))
.and(JobEntitySpecifications.withProject(project))
.and(JobEntitySpecifications.withCreateTime(createTime)));

如果在这里使用静态导入,可以使它看起来更好。

关于java - 是否可以在 Spring Boot 中在运行时构建自定义查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39015244/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com