sql:考虑删除两列作为元组,并使用列表的元素(元组)检查条件

问题描述 投票:0回答:1

有一个这样的表A

雇主ID 员工ID 开始日期A 结束日期A **
111 333 2022-01-03 2022-01-07
111 333 2022-01-11 2022-01-15
111 333 2022-01-17 2022-01-23

我需要一个sql删除语句来删除startDateA> startDateB和endDateA< endDateB by giving startDateB and endDateB in a list as a pair like this (('2022-01-02', '2022-01-09'),('2022-01-10', '2022-01-16'),('2022-01-16', '2022-01-25').

的所有条目

我尝试通过提供此列表作为参数来编写本机查询:

List<Pair<LocalDate, LocalDate>> pairs = new ArrayList<>();

列表中的每个元素都是一对。对的左侧是 startDateB,对的右侧是 endDateB。

你能帮我找出解决办法吗?

java sql hibernate db2
1个回答
0
投票

如果您希望在 Java 中使用此类查询,您可以执行以下操作:

使用Spring-data的JPARepository

此解决方案假设您有一个使用 JPA 配置的 TableA 类,并且您正在使用 Spring-data。

public interface TableARepository extends JPARepository<TableA> {
    @Modifying
    @Query("delete from tableA t where t.startDateA > :startDateB and endDateA < :endDateB")
    int deleteByDates(@Param("startDateB") LocalDate startDateB, @Param("endDateB") LocalDate endDateB);
}

使用EntityManager

此解决方案假设您已配置 JPA 以及为事务创建 EntityManager 的方法。

public int deleteByDates(LocalDate startDateB, LocalDate endDateB) {
    String sqlQuery = "delete from tableA t where t.startDateA > :startDateB and endDateA < :endDateB";
    EntityManager em = createEntityManager();
    try {
        Query query = em.createNativeQuery(sqlQuery);
        query.setParameter("startDateB", startDateB);
        query.setParameter("endDateB", endDateB);
        return query.executeUpdate();
    } finally {
        em.close();
    }
}

处理配对

在这两种情况下,您都可以使用另一种方法来调用它们,如下所示:

public int deleteByDates(Pair<LocalDate, LocalDate> pair) {
    return deleteByDates(pair.getValue0(), pair.getValue1());
}

处理列表

如果您有一个 Pair 列表,那么您可以用一种方法创建查询。有几种方法可以做到这一点,但简单又肮脏,可能像这样(更干净的方法是使用 JPA Criteria https://thorben-janssen.com/criteria-updatedelete-easy-way-to/):

public int deleteByDates(List<Pair<LocalDate, LocalDate>> datePairs) {
    if (datePairs == null || datePairs.isEmpty()) {
        return 0;
    }
    String whereList = IntStream.range(0, datePairs.size())
            .mapToObj(i -> "(t.startDateA > :startDate" + i + " and endDateA < :endDate" + i + ")")
            .collect(Collectors.joining(" or "));
    String sqlQuery = "delete from tableA t where " + whereList;
    EntityManager em = createEntityManager();
    try {
        Query query = em.createNativeQuery(sqlQuery);
        IntStream.range(0, datePairs.size())
                .forEach(i -> {
                    query.setParameter("startDate" + i, datePairs[i].getValue0());
                    query.setParameter("endDate" + i, datePairs[i].getValue1());
                });
        return query.executeUpdate();
    } finally {
        em.close();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.