#java #sql #sql-server #hibernate
#java #sql #sql-сервер #гибернация
Вопрос:
Я работаю над переходом с версии Hibernate 3 на версию Hibernate 5. В настоящее время я использую 5.4.0.Финальную версию.
У меня проблема с одним из тестов, который использует метод репозитория deleteByAllPatientFlowGens:
public void deleteByAllPatientFlowGens(List<PatientFlowGen> list) {
if (!list.isEmpty()) {
getEntityManager().createNamedQuery(DELETE_BY_ALL_PATIENT_FLOW_GENS_QUERY)
.setParameter("patient_flow_gens", list)
.executeUpdate();
}
}
Он должен вызвать именованный запрос:
@NamedQuery(name = RequestedFlowGenSettings.DELETE_BY_ALL_PATIENT_FLOW_GENS_QUERY,
query = "delete from RequestedFlowGenSettings where patientFlowGen in :patient_flow_gens")
Метод получает список с двумя элементами, но в журналах я вижу, что оба параметра являются обязательными как 1:
2019-03-19 04:44:16,855 DEBUG [main] SQL - delete from requested_flow_gen_settings where patient_flow_gen in (? , ?)
2019-03-19 04:44:16,858 TRACE [main] BasicBinder - binding parameter [1] as [BIGINT] - [2994]
2019-03-19 04:44:16,858 TRACE [main] BasicBinder - binding parameter [1] as [BIGINT] - [2995]
2019-03-19 04:44:16,864 ERROR [main] SqlExceptionHelper - The value is not set for the parameter number 2
С предыдущей версией гибернации (3.6.3.Final) все работало нормально. Есть логи:
2019-03-19 04:47:42,275 DEBUG [main] SQL - delete from requested_flow_gen_settings where patient_flow_gen in (? , ?)
2019-03-19 04:47:42,277 TRACE [main] BasicBinder - binding parameter [1] as [BIGINT] - 2996
2019-03-19 04:47:42,277 TRACE [main] BasicBinder - binding parameter [2] as [BIGINT] - 2997
P.S. Я попытался использовать метод setParameterList, но проблема была той же самой.
Ответ №1:
Я нашел единственный способ исправить проблему — выполнить именованный запрос для каждого элемента из списка. Итак, вот мой метод репозитория:
public void deleteByAllPatientFlowGens(List<PatientFlowGen> list) {
if (!list.isEmpty()) {
list.forEach(patientFlowGen -> {
getEntityManager().createNamedQuery(DELETE_BY_ALL_PATIENT_FLOW_GENS_QUERY)
.setParameter("patient_flow_gens", patientFlowGen)
.executeUpdate();
});
}
}
Я знаю, это быстрое грязное исправление. Но у меня нет выбора)