首页 > 解决方案 > 创建动态查询以根据多个 where 条件从数据库中获取条目

问题描述

下面是构建实体:

@Entity
@Table(name = "build")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Build {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Integer id;

    @ManyToOne(
            fetch = FetchType.EAGER,
            cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinColumn(name = "job_id", referencedColumnName = "id", nullable = false)
    private Job job;

    @Column(name = "build_url", nullable = false)
    private String buildUrl;

    @Column(name = "status")
    private String status;

    @Column(name = "name", nullable = false)
    private String name;
}

下面是我与数据库执行事务的存储库:

public interface BuildRepository extends CrudRepository<Build, Integer> {
    
    List<Build> findByStatus(@Param("status") String status);

    @Transactional
    @Modifying(flushAutomatically = true, clearAutomatically = true)
    @Query(value = "update Build set status = ?2 where id = ?1")
    void updateBuildStatus(int id, String status);
}

如果我必须获取特定 id 的条目,我可以在我的存储库中使用 findById()。

现在,我想根据 id、job 和 name 从表中获取条目。id、job 和 name 中至少有一个不为空。有人可以帮我构建可以处理这种情况的动态查询吗?

标签: springhibernatejpa

解决方案


感谢@yerlikayaoglu 的回复。通过将以下方法添加到我的存储库中解决了该问题:

@Query("select j FROM Build j where (:Id is null or j.id = :Id) and (:job is null or j.job = :job) and (:name is null or j.name = :name)")
        List<Build> findByIdAndJobAndName(
                @Param("Id") Integer Id,
                @Param("Job") JenkinsJob Job,
                @Param("Name") String Name);

这篇文章很有帮助:

https://www.baeldung.com/spring-data-jpa-null-parameters


推荐阅读