Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于删除重复Oracle SQL Db表项的NativeQuery不起作用(请参见代码)_Java_Sql_Oracle_Jpa_Junit - Fatal编程技术网

Java 用于删除重复Oracle SQL Db表项的NativeQuery不起作用(请参见代码)

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

我正试图编写代码来检查表中是否有重复的行,并删除除一行之外的所有标记行(保留一行,删除重复行)。我正在使用JPA NativeQuery,如下所示,并使用以下SQL命令:

  @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>