Spring 数据 JPA 查询方法查找所有空列表对象 属性

Spring Data JPA Query method to find all objects with empty list property

我有一个包含 属性 列表的实体:

@Entity
@Table(name="sales.jobs")
public class Job {
    ...
    private List<Shipment> jobShipments;
    ...
    @OneToMany(cascade=CascadeType.ALL,orphanRemoval=true, fetch=FetchType.LAZY)
    @JoinTable(name="sales.jobs_shipments",
           joinColumns = @JoinColumn(name="fk_jobid", referencedColumnName="pk_jobid"),
           inverseJoinColumns = @JoinColumn(name="fk_shipmentid", referencedColumnName="pk_shipmentid"))
    public List<Shipment> getJobShipments() {
        return jobShipments;
    }

    public void setJobShipments(List<Shipment> jobShipments) {
        this.jobShipments = jobShipments;
    }
    ...
}

在存储库中,我想要一个查询方法,其中 returns 所有 jobShipments 为空列表的作业。我首先尝试了 IsNull 关键字,如下所示,但这不起作用,因为如果没有发货,它是一个空列表而不是空列表。

@Repository
public interface JobRepository extends CrudRepository<Job, Integer> {
    Page<Job> findByJobShipmentsIsNull(Pageable pageable);
}

我查看了文档中的关键字,希望找到类似 IsEmpty 的内容,但我找不到任何看起来正确的内容。

我正在寻找使用关键字而不是编写查询的答案,但我想这将是后备方法。谢谢!

事实证明,IsNull 确实有效。我检查了 IsNotNull 作为参考点,它给了我所有确实有发货的工作。然后我 运行 这个查询

SELECT COUNT(*) FROM sales.jobs AS jobs
    LEFT JOIN sales.jobs_shipments AS ship ON jobs.PK_JobID = ship.FK_JobID
WHERE ship.FK_ShipmentID IS NULL;

该查询的计数与 IsNull 存储库查询的结果相匹配。所以即使它返回一个空数组,它仍然像我的查询一样找到空条目。

实际上,集合有关键字 IsEmptyEmpty

@Repository
public interface JobRepository extends CrudRepository<Job, Integer> {
    Page<Job> findByJobShipmentsIsEmpty(Pageable pageable);
}
@Entity
@Table(name="sales.jobs")
public class Job {
    ...
    @OneToMany(cascade=CascadeType.ALL,orphanRemoval=true, fetch=FetchType.LAZY)
    @JoinTable(name="sales.jobs_shipments",
           joinColumns = @JoinColumn(name="fk_jobid", referencedColumnName="pk_jobid"),
           inverseJoinColumns = @JoinColumn(name="fk_shipmentid", referencedColumnName="pk_shipmentid"))
    private List<Shipment> jobShipments = new ArrayList<Shipment>();
}

参见 Appendix C: Repository Query Keywords