【问题标题】:Spring Data JPA Query method to find all objects with empty list propertySpring Data JPA Query方法查找具有空列表属性的所有对象
【发布时间】:2018-07-10 14:49:11
【问题描述】:

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

@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;
    }
    ...
}

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

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

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

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

【问题讨论】:

    标签: java collections spring-data-jpa is-empty


    【解决方案1】:

    其实集合中有关键字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

    【讨论】:

    • 谢谢。我一定是不知何故错过了附录。
    【解决方案2】:

    事实证明,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 存储库查询的结果相匹配。因此,即使它返回一个空数组,它仍然会像我的查询一样找到空条目。

    【讨论】:

      猜你喜欢
      • 2020-08-19
      • 2014-08-17
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多