有一个这样的表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 中使用此类查询,您可以执行以下操作:
使用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();
}
}