NativeQuery 删除重复的 Oracle SQL Db 表条目不起作用(参见代码)

Posted

技术标签:

【中文标题】NativeQuery 删除重复的 Oracle SQL Db 表条目不起作用(参见代码)【英文标题】:NativeQuery to DELETE duplicate Oracle SQL Db table entries does not work (see code) 【发布时间】:2019-10-13 16:21:44 【问题描述】:

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

  @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());
    

  

SELECT * FROM TABLE 的函数来检查删除是否已经完成:

  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();

我的 Junit 测试如下测试代码的可操作性:

@Before
  public void setUp() throws InterruptedException 

    batchRepo.save(batch);
    propertyRepo.save(property);

    dog1 = createSameDog();
    dog2 = createSameDog();
    dog3 = createSameDog();
    dog4 = createSameDog();
    dog5 = createDifferentDog();


    DogRepo.save(dog1);
    DogRepo.save(dog2);
    DogRepo.save(dog3);
    DogRepo.save(dog4);
    DogRepo.save(dog5);
  

第一个测试 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>

据我了解,这意味着对函数 findandDeleteDupDogs() 的查询根本没有执行任何操作,并且所有五只狗(包括重复项)仍然存在。

我似乎无法理解我做错了什么,希望能有一些新鲜的眼睛来看看这个,谢谢!

【问题讨论】:

你能在findandDeleteDupDogs上尝试注释@Transcational 不起作用。我以前将该注释放在班级级别,也没有运气 你检查过delete语句中select子句的结果吗?它会返回任何东西吗?顺便提一句。今天有一个讨论如何create sql qeuries in Java,可能是普遍的兴趣。 【参考方案1】:

您应该致电query.executeUpdate()。现在您只是创建查询而不实际运行它们。

【讨论】:

你,是救生员。谢谢!

以上是关于NativeQuery 删除重复的 Oracle SQL Db 表条目不起作用(参见代码)的主要内容,如果未能解决你的问题,请参考以下文章

“插入忽略”或“重复键更新”使用 @Query 和 @Modifying 而不使用 nativeQuery 或 save() 或 saveAndFlush() JPA Hibernate

oracle删除重复的行怎么删啊

oracle删除重复的行怎么删啊

oracle之如何删除表中的重复记录只保留其中一条

oracle 查找删除重复数据

Oracle删除重复字符