Java 用于删除重复Oracle SQL Db表项的NativeQuery不起作用(请参见代码)
我正试图编写代码来检查表中是否有重复的行,并删除除一行之外的所有标记行(保留一行,删除重复行)。我正在使用JPA NativeQuery,如下所示,并使用以下SQL命令:Java 用于删除重复Oracle SQL Db表项的NativeQuery不起作用(请参见代码),java,sql,oracle,jpa,junit,Java,Sql,Oracle,Jpa,Junit,我正试图编写代码来检查表中是否有重复的行,并删除除一行之外的所有标记行(保留一行,删除重复行)。我正在使用JPA NativeQuery,如下所示,并使用以下SQL命令: @PersistenceContext private EntityManager em; public void findandDeleteDupDogs() { String deleteString = "DELETE FROM DOGS"; String wherestrin
@PersistenceContext private EntityManager em;
public void findandDeleteDupDogs() {
String deleteString =
"DELETE FROM DOGS";
String wherestring = "WHERE rowid not in";
String selectminstring = "(SELECT MIN(rowid)";
String fromstring = "FROM DOGS";
String groupbystring = "GROUP BY NAME, SPECIES)";
String sqlString =
String.format(
"%s %s %s %s %s ",
deleteString,
wherestring,
selectminstring,
fromstring,
groupbystring);
try {
Query query = em.createNativeQuery(sqlString);
} catch (Exception e) {
log.error(e.getMessage());
}
}
函数从表中选择*以检查是否已删除:
public List<Dog> selectAll(){
String selectString = "SELECT * FROM DOGS";
Query query = em.createNativeQuery(selectString);
try {
List<Dog> results = query.getResultList();
return results;
} catch (Exception e) {
log.error(e.getMessage());
return Collections.emptyList();
}
测试SELECT语句的第一个测试运行良好:
@Test
public void testSelectStatement(){
assertThat(DogRepository.selectAll().size()).isEqualTo(5);
}
第二次测试失败:
@Test
public void deletedupdogs() {
DogRepository.findandDeleteDupDogs();
assertThat(DogRepository.selectAll().size()).isEqualTo(2);
}
这就是错误:
org.opentest4j.AssertionFailedError:
Expecting:
<5>
to be equal to:
<2>
org.opentest4j.AssertionFailedError:
期望:
等于:
据我所知,这意味着对函数findanddedeletedupdogs()
的查询根本没有做任何事情,并且所有五只狗(包括重复的)仍然存在
我似乎不明白我做错了什么,希望能有新的眼光来看待这件事,谢谢 您应该调用
query.executeUpdate()
。现在您只创建了查询,而没有实际运行它们。您可以尝试在find上添加注释@transnational
,但删除dupdogs
不起作用。我以前将该注释放在类级别,但没有运气。您是否检查了delete语句中select子句的结果?它还回什么吗?顺便说一句,今天有一个讨论如何,可能是大家都感兴趣的。你,是一个救命恩人。非常感谢。
org.opentest4j.AssertionFailedError:
Expecting:
<5>
to be equal to:
<2>