NativeQuery для удаления дубликатов записей таблицы Oracle SQL Db не работает (см. Код) - PullRequest
0 голосов
/ 13 октября 2019

Я пытаюсь написать код для проверки таблицы на наличие дублирующихся строк и удаления всех отмеченных строк, кроме одной (оставьте одну, удалите дубликаты). Я использую 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());
    }

  }

Функция для 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() вообще ничего не делал, и все пять собак (включая дубликаты) все еще существуют.

Кажется, я не понимаю, что я сделал не так, и был бы признателен, если взглянул на это свежим взглядом, спасибо!

1 Ответ

1 голос
/ 13 октября 2019

Вам следует позвонить query.executeUpdate(). Теперь вы только создаете запросы, фактически не выполняя их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...