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