запрос, сгенерированный hibernate, не соответствует письменному запросу - PullRequest
0 голосов
/ 18 января 2020

со мной происходит что-то сумасшедшее. Я работаю над проектом весенней загрузки, который был сгенерирован с помощью Jhipster. Я сделал простой JPQL-запрос, подобный следующему

select item from ItemObject item where (item.ins between :dateBegin and :dateEnd) or (item.mod between :dateBegin and :dateEnd)

Я поставил show_ sql = true и могу увидеть запрос, сгенерированный Hibernate. Сначала в окне консоли отображается правильный запрос, сгенерированный Hibernate. Но через одну секунду генерируется огромный запрос (несколько десятков страниц) и результат может быть бесконечным (с учетом длины запроса и времени, которое он занимает). Это абсолютно безумно Я никогда не видел этого. Я должен добавить, что этот запрос работал хорошо почти мгновенно несколько дней go. Вы можете помочь мне ? Я не могу показать вам огромный запрос, потому что я не на работе, но я просто спрашиваю вас, видели ли вы это уже. Так что не оценивайте меня плохо за пост

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Я объясню вам, в каком случае это проходит. Вот моя модель:

       MainObject----ItemObject------------Property1Object
                         |             |---Property2Object
                         |             |---Property3Object
                       -----           |---Property4Object
                       | | |
                       Assoc
                       | | |
                      PaObject

Я напоминаю вам, что цель состоит в том, чтобы выполнить следующий запрос без проблем

select item from ItemObject item where (item.ins between :dateBegin and :dateEnd) or (item.mod between :dateBegin and :dateEnd)

Если, прежде чем выполнить предыдущий запрос, я прохожу 2 следующих шага , isuue нет, и я не знаю, почему

ШАГ 1: сделать запрос на MainObject, чтобы получить все эти объекты, которые были изменены или вставлены. Этот шаг не является обязательным, но это этап подготовки к STEP2. STEP2 - это код, который делает запрос без проблем

STEP2: из STEP1 я получаю List<MainObject> mainObjectsList. Поэтому я применяю следующий код:

List<CustomObject> customObjects = new ArrayList<CustomObject>();
for (MainObject mainObject : mainObjectsList) {
      customObjects.addAll(constructCustomObjectFromMainObject(mainObject));
}

С CustomObject, который представляет собой следующий

public class CustomObject    {
    private static final long serialVersionUID = 4L;

    private String itemProperty1;
    private String itemProperty2;
    private String itemProperty3;
    private String itemProperty4;
    List<PaObject> paObjectData;
    private Property1Object  property1Object;
    private Property2Object  property2Object;
    private Property3Object  property3Object;
    private Property4Object  property4Object;
}

и метод constructCustomObjectFromMainObject

    private  List<CustomObject> constructCustomObjectFromMainObject(MainObject mainObject) {
        List<CustomObject> customObjectList = new ArrayList<CustomObject>();
        for (ItemObject item : mainObject.getItems()) {
            customObjectList.add(constructCustomObject(item, true, true, true, true));
        }
        return customObjectList;
    }

   private CustomObject constructCustomObject(ItemObject item, boolean property1Flag, boolean property2Flag, boolean property3Flag, boolean property4Flag) {
        CustomObject customObject = new CustomObject();
        customObject.setItemProperty1(item.getProperty1());
        customObject.setItemProperty2(item.getProperty2());
        customObject.setItemProperty3(item.getProperty3());
        customObject.setItemProperty4(item.getProperty4());
        Set<Assoc> assocSet = item.getAssoc();
        List<PaObject> paObjectList = new ArrayList<PaObject>();
        for (Assoc assoc : assocSet) {
          paObjectList.add(assoc.getPaObject());
        }
        customObject.setpaObjectList(paObjectList);
        if (property1Flag) {
            customObject.setProperty1Object(item.getProperty1Object());
        }
        if (property2Flag) {
            customObject.setProperty2Object(item.getProperty2Objects());
        }
        if (property3Flag) {
            customObject.setProperty3Object(item.getProperty3Object());
        }
        if (property4Flag) {
            customObject.setProperty4Object(new DataConverter().toProperty4Object(item));
        }

        return customObject;
    }

Я суммирую: когда STEP2 выполняется, мой запрос цели проходит без проблем

0 голосов
/ 20 января 2020

Я поставил следующие параметры ведения журнала

logging:
    file: logs/application-test.log
    level:
        ROOT: DEBUG
        com.package.vol: INFO
        io.github.jhipster: DEBUG
        org:
          hibernate: 
            SQL:
              TRACE
            type:
               descriptor:
                  sql:
                    BasicBinder:
                      TRACE

И журнал показывает, что он генерирует много запросов. например, ItemObject (table0) связан с Object1 (table1) Object2 (table2) et c .... и генерирует запрос

select tb1.property1, .........., tb1.property50 
from table1 tb1
left outer join table0 on ...
left outer join table2 on ....
.........
left outer join table10 on ...
where tb1.item_id = ?

, и это для каждой таблицы, связанной с table0, то есть table1, table2 и т. д.

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