Нативное сопоставление запросов на лету openJPA

Мне интересно, можно ли сопоставить именованный собственный запрос «на лету» вместо того, чтобы возвращать список Object [], а затем перебирать и настраивать объект таким образом. У меня есть вызов, который, как я знаю, плохо возвращает массивный набор данных, и я хочу иметь возможность сопоставить его прямо с моей сущностью. Могу ли я это сделать или мне придется продолжать перебирать набор результатов.

Вот чем я сейчас занимаюсь...

List<Provider> ObjList = (List<Provider>) emf.createNativeQuery(assembleQuery(organizationIDs, 5)).getResultList();

Это моя сущность, Список (моя сущность — поставщик). Обычно я просто возвращал бы List<Object[]>, а затем прокручивал бы это, чтобы вернуть все объекты, настроить их как новых поставщиков и добавить их в список....

//List<Provider> provList = new ArrayList<Provider>(); 
/*for(Object[] obj: ObjList)
{
    provList.add(this.GetProviderFromObj(obj));
}*/

Как видите, я закомментировал этот участок кода, чтобы попробовать. Я знаю, что вы можете сопоставить именованные нативные запросы, если поместите свой нативный запрос в сам объект, а затем вызовете его через createNamedQuery. Я бы сделал это так, но мне нужно использовать ключевое слово IN оракула, потому что у меня есть список идентификаторов, которые я хочу проверить. Это не просто то, что нужно. И, как мы все знаем, нативные запросы плохо обрабатывают ключевое слово in. Любой совет?

Эх, если бы только ключевое слово IN хорошо поддерживалось для NamedNativeQueries.


person SoftwareSavant    schedule 19.10.2012    source источник
comment
Я немного смущен вашим вопросом. Вы спрашиваете, есть ли способ заставить OpenJPA напрямую возвращать список объектов Provider при вызове createNativeQuery(...).getResultList(), чтобы вам не приходилось вручную преобразовывать объекты в Providers?   -  person Templar    schedule 20.10.2012
comment
Ага. Я понял. Вам нужно установить именованное сопоставление, а затем вы вызываете его при вызове собственного запроса.   -  person SoftwareSavant    schedule 21.10.2012


Ответы (1)


Предполагая, что Provider настроен как объект JPA, вы должны иметь возможность указать класс в качестве второго параметра для вашего вызова createNativeQuery. Например:

List<Provider> ObjList = (List<Provider>) emf.createNativeQuery(assembleQuery(organizationIDs, 5), Provider.class).getResultList();

Согласно документации: «Как минимум ваш SQL должен выбрать столбцы первичного ключа класса, столбец дискриминатора (если сопоставлен) и столбец версии (также если сопоставлен)».

Дополнительные сведения см. в документации OpenJPA.

person Templar    schedule 21.10.2012