Оптимизация Spring -Дата JPA запросов

Я ищу возможную оптимизацию для запросов, сгенерированных каркасом. Насколько я понимаю, процесс следующий:

  • вы можете объявить объекты домена как POJO и добавить несколько аннотаций, таких как @Entity, @Table, @ManyToOne и т.д.

  • вы объявляете свои репозитории, например. на интерфейсы

С (2) у вас есть несколько вариантов описания вашего запроса: например. за имена методов или @Query

Если я напишу запрос, например:

@Query("select t from Order t LEFT join fetch t.orderPositions where t.id = ?1")
Page<Order> findById(Pageable pageable, String id);

SQL-запрос автогенерируется, где каждый столбец порядка разрешен и подпоследовательно для ордеров и зависимых значений/таблиц. Как будто я написал:

select * from order

Итак, в случае, если мне нужна информация из нескольких связанных объектов, запрос может быть довольно дорогостоящим: и более интересным является весьма неэффективным. Я наткнулся на медленный запрос, и MySQL объяснил мне, что в сгенерированном запросе оптимизатор не может использовать индексы, что плохо.

Конечно (я знаю) Мне приходится иметь дело с компромиссом, который сгенерировал SQL не так оптимально, как написано вручную, и имеет преимущество написания менее шаблонного кода.

Мой вопрос: какие хорошие стратегии для улучшения запросов, выполнения запросов?

Я подумал о некоторых вариантах:

1) Можно ли определить несколько "Объектов" для разных целей, например Order для доступа ко всем характеристикам порядка и что-то вроде FilteredOrder с меньшим количеством столбцов и без разрешения Join-columns? Оба будут ссылаться на одни и те же таблицы, но каждый будет использовать все столбцы, а другой только некоторые.

2) Используйте @Query(... native="true") с выбором всех столбцов, которые я хочу использовать. Преимущество этого было бы в том, что я не буду удваивать свои доменные объекты и помещать свою кодовую базу сотнями Filtered -Objects. Как насчет пейджинга? Использование pageable в сочетании с @Query( ...native="true") все еще возможно (я боюсь, что нет).

3) Последнее, но в моих глазах "худшее" решение: используйте JDBCTemplates и делайте материал на более низком уровне.

Есть ли другие варианты, о которых я не думал? Благодарим вас за любое вдохновение в этой теме:]

Update: Наша текущая стратегия следующая

1) По возможности я работаю с выбором нового Поскольку я видел, это работает для каждого объекта (будь то Entity или POJO)

2) В сочетании с представлениями базы данных можно взять лучшее из SQL и ORM. Для некоторых случаев, представляющих интерес, может быть интересен совокупный набор результатов. Определение этого набора результатов как вида облегчает работу с db-перспективой, чтобы наблюдать результат с помощью простого оператора select. Для ORM-стороны это означает, что вы можете легко определить объект, соответствующий этому представлению, и вы получите полное ORM-доброту сверху: Paging, включая

Ответ 1

Одним из решений является использование DTO:

@Query("select new FilteredOrder(o.name, o.size, o.cost) from Order o where o.id = ?1")
Page<FilteredOrder> findFilteredOrderById(Pageable pageable, String id);

Если вы хотите иметь сущности для генерации некоторых отчетов, возможно, вам стоит подумать об использовании nosql datastore?

Ответ 2

Взгляните на ленивую стратегию JPA. Это позволит вам выбирать объекты без их отношений, но будет получать отношения, когда вы ссылаетесь на них.