Добрый день. При миграции с версии 1.1.3 на 2.7.4. столкнулся с изменение поведения в работе dataManager, мало того что один и тот же код стал формировать другой sql запрос, так ещё и сам запрос формируется заведомо без возвращаемых значений.
Пример:
private Map<LocalDate, DepartmentExamination> getDepartmentExaminations(CalendarPeriodDto calendarPeriod) {
return dataManager.load(DepartmentExamination.class)
.condition(LogicalCondition.and(
PropertyCondition.equal("examination", calendarPeriod.getExamination()),
PropertyCondition.equal("examinationUnit", calendarPeriod.getExaminationUnit()),
PropertyCondition.greaterOrEqual("date", calendarPeriod.getStartDate()),
PropertyCondition.lessOrEqual("date", calendarPeriod.getEndDate())
))
.fetchPlan("departmentExamination-full-fetch-plan")
.list().stream()
.collect(Collectors.toMap(DepartmentExamination::getDate, Functions.identity(),
(o1, o2) -> Integer.compare(o1.getNumber(), o2.getNumber()) == -1 ? o2 : o1));
}
При передаче параметров где calendarPeriod.getExaminationUnit() = null , приводит к формированию следующего sql запроса:
SELECT t1.ID, t1.CREATED_BY, t1.CREATED_DATE, t1.DATE_, t1.DELETED_BY, t1.DELETED_DATE, t1.DEPARTMENT, t1.II_NUMBER, t1.LAST_MODIFIED_BY, t1.LAST_MODIFIED_DATE, t1.MAIN_DEPARTMENT, t1.NUMBER,
t1.ORGANIZATION, t1.VERSION, t1.EXAMINATION_ID, t1.EXAMINATION_UNIT_ID, t0.ID, t0.CREATED_BY, t0.CREATED_DATE, t0.DELETED_BY, t0.DELETED_DATE, t0.DESCRIPTION, t0.LAST_MODIFIED_BY, t0.LAST_MODIFIED_DATE,
t0.NAME, t0.SHORT_NAME, t0.VERSION, t0.PERIODICITY_ID, t2.ID, t2.CREATED_BY, t2.CREATED_DATE, t2.DELETED_BY, t2.DELETED_DATE, t2.DESCRIPTION, t2.LAST_MODIFIED_BY, t2.LAST_MODIFIED_DATE, t2.NAME, t2.SHORT_NAME,
t2.VERSION
FROM MED_EXAMINATION t0, MED_EXAMINATION_UNIT t2, MED_DEPARTMENT_EXAMINATION t1
WHERE (((((((t1.EXAMINATION_ID = ?) AND (t1.EXAMINATION_UNIT_ID IS NULL)) AND (t1.DATE_ >= ?)) AND (t1.DATE_ <= ?)) AND ((((t1.MAIN_DEPARTMENT = ?) OR (t1.MAIN_DEPARTMENT IN (?))) OR (t1.MAIN_DEPARTMENT = ?))
AND (t1.ORGANIZATION = ?))) AND (t1.DELETED_DATE IS NULL)) AND (((t0.ID = t1.EXAMINATION_ID) AND (t0.DELETED_DATE IS NULL)) AND ((t2.ID = t1.EXAMINATION_UNIT_ID) AND (t2.DELETED_DATE IS NULL))))
bind => [019c55d4-3869-789d-9b39-5605214fed1a, 2026-02-14, 2026-02-14, D010, D020, ALL, Y001]
Если посмотреть внимательно в запросе два противоречащих друг другу условия:
t1.EXAMINATION_UNIT_ID IS NULL
t2.ID = t1.EXAMINATION_UNIT_ID
Запрос не возвращает никаких данных.
Тот же самый код в jmix 1.1.3 выдаёт следующий запрос:
SELECT t1.ID, t1.CREATED_BY, t1.CREATED_DATE, t1.DATE_, t1.DELETED_BY, t1.DELETED_DATE, t1.DEPARTMENT, t1.II_NUMBER, t1.LAST_MODIFIED_BY, t1.LAST_MODIFIED_DATE, t1.MAIN_DEPARTMENT, t1.NUMBER,
t1.ORGANIZATION, t1.VERSION, t1.EXAMINATION_ID, t1.EXAMINATION_UNIT_ID, t0.ID, t0.CREATED_BY, t0.CREATED_DATE, t0.DELETED_BY, t0.DELETED_DATE, t0.DESCRIPTION, t0.LAST_MODIFIED_BY, t0.LAST_MODIFIED_DATE,
t0.NAME, t0.SHORT_NAME, t0.VERSION, t0.PERIODICITY_ID, t2.ID, t2.CREATED_BY, t2.CREATED_DATE, t2.DELETED_BY, t2.DELETED_DATE, t2.DESCRIPTION, t2.LAST_MODIFIED_BY, t2.LAST_MODIFIED_DATE, t2.NAME, t2.SHORT_NAME,
t2.VERSION FROM MED_DEPARTMENT_EXAMINATION t1 LEFT OUTER JOIN MED_EXAMINATION_UNIT t2 ON (t2.ID = t1.EXAMINATION_UNIT_ID), MED_EXAMINATION t0
WHERE ((((((t1.EXAMINATION_ID = ?) AND (t1.DATE_ >= ?)) AND (t1.DATE_ <= ?)) AND ((((t1.MAIN_DEPARTMENT = ?) OR (t1.MAIN_DEPARTMENT IN (?))) OR (t1.MAIN_DEPARTMENT = ?)) AND (t1.ORGANIZATION = ?))) AND (t1.DELETED_DATE IS NULL)) AND ((t0.ID = t1.EXAMINATION_ID) AND (t0.DELETED_DATE IS NULL)))
bind => [e1a79c45-6e05-8df5-af30-d1f1c0c86d1b, 2026-02-14, 2026-02-14, D010, D020, ALL, Y001]
Данные возвращаются.