JPA нетерпеливая выборка не присоединяется

В соответствии с вашим примером вам нужно отсортировать по двум полям (фамилия, имя), а не по одному. Вы можете использовать библиотеку Alasql , чтобы сделать этот вид в одной строке:

var res = alasql('SELECT * FROM ? ORDER BY last_nom, first_nom',[objs]);

Попробуйте этот пример в jsFiddle .

104
задан Steve Kuo 21 January 2009 в 01:16
поделиться

4 ответа

fetchType приписывают средства управления, выбирается ли аннотируемое поле сразу, когда основной объект выбирается. Это не обязательно диктует, как оператор выборки создается, фактическая sql реализация зависит от поставщика, Вы используете toplink/hibernate и т.д.

, Если Вы устанавливаете fetchType=EAGER, Это означает, что аннотируемое поле заполняется с его значениями в то же время, что и другие поля в объекте. Таким образом, если Вы открываетесь, entitymanager получают Ваши объекты человека и затем закрывают entitymanager, впоследствии делание person.address не приведет к ленивому выданному исключению загрузки.

, Если Вы устанавливаете fetchType=LAZY, поле только заполняется, когда к нему получают доступ. При закрытии entitymanager к тому времени, ленивое исключение загрузки будет выдано, если Вы сделаете person.address. Для загрузки поля, необходимо отложить объект в entitymangers контекст с em.merge (), затем сделать доступ к полю и затем закрыть entitymanager.

Вы могли бы хотеть ленивую загрузку при построении клиентского класса с набором для потребительских заказов. При получении каждого порядка на клиента, когда Вы хотели получить список клиентов, это может быть дорогой операцией базы данных когда Вы только ищущий имя клиента и контактную информацию. Лучше всего оставить доступ дб до позже.

Для второй части вопроса - как добраться, в спящем режиме для генерации оптимизированного SQL?

В спящем режиме, должен позволить Вам обеспечивать подсказки относительно того, как создать самый эффективный запрос, но я подозреваю, что существует что-то не так с Вашей конструкцией таблицы. Отношения устанавливаются в таблицах? Будьте в спящем режиме, возможно, решил, что простой запрос будет более быстрым, чем соединение особенно, если индексы и т.д. будут отсутствовать.

37
ответ дан Tomasz Nurkiewicz 5 November 2019 в 11:09
поделиться

Две вещи происходят со мной.

Первый, действительно ли Вы уверены, что имеете в виду ManyToOne для адреса? Это означает, что у нескольких человек будет тот же адрес. Если это будет отредактировано для одного из них, это будет отредактировано для всех них. То Ваше намерение? 99% адресов времени являются "частными" (в том смысле, что они принадлежат только одному человеку).

, Во-вторых, у Вас есть какие-либо другие нетерпеливые отношения на объекте Человека? Если я вспоминаю правильно, В спящем режиме, может только обработать нетерпеливые отношения на объекте, но это - возможно устаревшая информация.

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

-1
ответ дан cletus 5 November 2019 в 11:09
поделиться

"mxc" is right. fetchType just specifies when the relation should be resolved.

To optimize eager loading by using an outer join you have to add

@Fetch(FetchMode.JOIN)

to your field. This is a hibernate specific annotation.

43
ответ дан 24 November 2019 в 03:59
поделиться

Если вы используете EclipseLink вместо Hibernate, вы можете оптимизировать свои запросы с помощью «подсказок запросов». См. Эту статью в Eclipse Wiki: EclipseLink / Примеры / JPA / QueryOptimization .

Есть глава о «Совместном чтении».

7
ответ дан 24 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: