org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: FROM, при попытке удалить таблицу, которая соединена сама с собой - PullRequest
0 голосов
/ 04 августа 2020

Я пытаюсь запустить запрос в спящем режиме. Я делаю это следующим способом:

private void insertQuery(String toDeleteNewOrOld) {

    String queryString = "";
    if("deleteNew".equals(toDeleteNewOrOld)){
         queryString =
          " delete dmpg2 \n"
        + "from DmPriceGroup dmpg1 \n"
        + " join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId \n"
        + " where dmpg1.uid <> dmpg2.uid \n"
        + " and dmpg1.priceGroupName <> dmpg2.priceGroupName \n"
        + " and dmpg1.dmCreateTime > dmpg2.dmCreateTime";
    }
    else if("deleteOld".equals(toDeleteNewOrOld)){
         queryString =
          "DELETE dmpg1\n"
        + "FROM DmPriceGroup dmpg1\n"
        + "join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId\n"
        + "where dmpg1.uid <> dmpg2.uid\n"
        + "and dmpg1.priceGroupName = dmpg2.priceGroupName\n"
        + "and dmpg1.dmCreateTime > dmpg2.dmCreateTime\n";
    }

    Map<String, Object> parameters = new HashMap<>();

    writerLogic.executeQuery(getDmEntityClass(), queryString, parameters);
}

Когда я его выполняю, используется строка запроса условия deleteold, но это не удается со следующей ошибкой

org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FROM near line 2, column 1 [DELETE dmpg1
FROM com.schantz.generallife.dm.model.DmPriceGroup dmpg1
join com.schantz.generallife.dm.model.DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId
where dmpg1.uid <> dmpg2.uid
and dmpg1.priceGroupName = dmpg2.priceGroupName
and dmpg1.dmCreateTime > dmpg2.dmCreateTime
]

Глядя на похожие вопросы, кажется, что это вызвано неправильным синтаксисом, однако, когда я вручную запускаю следующий код в ssms, он работает нормально

DELETE dmpg1
FROM DmPriceGroup dmpg1
join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId
where dmpg1.uid <> dmpg2.uid
and dmpg1.priceGroupName = dmpg2.priceGroupName
and dmpg1.dmCreateTime > dmpg2.dmCreateTime

Удаление dmpg1 после DELETE приведет к неожиданному вместо этого токен "присоединиться". Однако я не верю, что я смогу удалить из DmPriceGroup, не уточняя, кто присоединился к DmPriceGroup для удаления

1 Ответ

0 голосов
/ 04 августа 2020

Это невозможно, согласно этому источнику.

Вместо этого вы можете получить все идентификаторы, запустить для них deleteAll () (Или, возможно, написать собственный SQL, но Я не предпочту этого).

...