1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/best_handsome-mybatis-plus-join

 / Детали:

Использование left join для объединения пользовательских SQL-запросов приводит к ошибкам, когда в условии...

Предстоит сделать
Владелец
Создано  
21.04.2025

WHERE добавляется оператор AND. Это происходит потому, что каждый раз, когда добавляется новое условие, оператор AND добавляется к существующему условию WHERE, что может привести к некорректному SQL-запросу.

Подтверждение

  • Мой вариант является последней версией, версия номера соответствует версии, и в проекте нет конфликтов зависимостей
  • Я уже поискал в issues, и подтвердил, что проблема ещё не была поднята
  • Я уже изменил заголовок, заменив описание на описание проблемы, с которой столкнулся

Текущая версия программы

1.5.3
База данных: mysql-8.0.4

Описание проблемы

При использовании left join для объединения пользовательского SQL, когда есть условия, после WHERE всегда добавляется AND, что приводит к ошибке

Подробный стек-трейс```bash

Код:
private MPJLambdaWrapper buildQueryWrapper(DeviceLogBo bo) {
MPJLambdaWrapper lqw = JoinWrappers.lambda();
lqw.selectAll(DeviceLog.class)
.selectAs("tt.device_no", DeviceLog::getDeviceNo)
.selectAs("sup.supplier_name", DeviceLog::getSupplierName)
.leftJoin(String.format("(select device_id,device_no,supplier_id from t_meter union all select device_id,device_no,supplier_id from t_terminal) tt on tt.device_id = %s.device_id",
lqw.getAlias()))
.leftJoin("t_supplier sup on sup.supplier_id = tt.supplier_id");
lqw.eq(bo.getDeviceId() != null, DeviceLog::getDeviceId, bo.getDeviceId());
lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), "sup.supplier_name", bo.getSupplierName());
lqw.eq(StringUtils.isNotBlank(bo.getDeviceType()), DeviceLog::getDeviceType, bo.getDeviceType());
lqw.like(StringUtils.isNotBlank(bo.getDeviceNo()), "tt.device_no", bo.getDeviceNo());
return lqw;
}
Сгенерированный SQL:

SQL: SELECT COUNT(*) FROM (SELECT t.id, t.device_type, t.device_id, t.pre_status, t.current_status, t.remark, t.create_dept, t.create_by, t.create_time, t.tenant_id, tt.device_no AS deviceNo, sup.supplier_name AS supplierName FROM t_device_log t LEFT JOIN (SELECT device_id, device_no, supplier_id FROM t_meter UNION ALL SELECT device_id, device_no, supplier_id FROM t_terminal) tt ON tt.device_id = t.device_id LEFT JOIN t_supplier sup ON sup.supplier_id = tt.supplier_id WHERE t.device_id = ?) TOTAL

Комментарий (0)

GitLife Service Account Задача создана

Вход Перед тем как оставить комментарий

Статус
Ответственный
Контрольная точка
Pull Requests
Связанные запросы на слияние могут быть закрыты после их объединения
Ветки
Дата начала   -   Крайний срок
-
Закрепить/Открепить
Приоритет
Участники(1)
1
https://api.gitlife.ru/oschina-mirror/best_handsome-mybatis-plus-join.git
git@api.gitlife.ru:oschina-mirror/best_handsome-mybatis-plus-join.git
oschina-mirror
best_handsome-mybatis-plus-join
best_handsome-mybatis-plus-join