Я столкнулся с очень странной проблемой (ИМО). Я занимаюсь разработкой проекта, в котором используются очень старые (и совсем не оптимизированные) таблицы, и мы использовали Spring с Hibernate для выполнения тяжелой работы по запросам к BBDD, но при доступе к одной из них мы зашли в тупик. из наших самых тяжелых таблиц (набор отношений между другими таблицами и т. д.), поскольку SQL-код, который пытался сгенерировать Spring, был очень большим и совсем не быстрым.
ТАК! Я начал использовать JPQL, чтобы по-прежнему использовать некоторые возможности, предоставляемые инфраструктурой, и с помощью некоторых сообщений здесь и там я нашел это решение для необязательных параметров:
Код: Выделить всё
@Query("SELECT e FROM Example e LEFT JOIN e.houses ho " +
"WHERE " +
"(:someValue1 IS NULL OR e.someValue1 = someValue1) AND " +
"(:someValue2 IS NULL OR e.someValue2 = someValue2) AND " +
"(:someValue3 IS NULL OR e.someValue3 = someValue3)")
Конечно, доступ к НАМНОГО большему количеству свойств и с кучей специфических фильтров, но дело не в этом, это была просто прославленная длинная версия примера. Поэтому, когда я использовал этот запрос, независимо от количества параметров, которые я активировал (или нет), если я возьму SQL, сгенерированный из Hibernate, и запущу его на нашем BD, запросы будут отвечать очень быстро (нужно!), НО всякий раз, когда я пытаюсь использовать запрос из моего приложения выполняется медленно, но ДЕЙСТВИТЕЛЬНО МЕДЛЕННО. Мы говорим от ~1 секунды до 14+ секунд.
Я уже понял, что это ошибка предложения OR (после множества тестов и перехода вперед и назад), потому что, если я удалю их и просто начните передавать параметры, которые будут использоваться, он снова начнет работать быстро.
Может ли кто-нибудь дать мне объяснение? Я просто хочу это понять.
Заранее спасибо!
Подробнее здесь:
https://stackoverflow.com/questions/791 ... parameters