Результаты запроса на основе JPA 2.0 в виде карты
Я запускаю собственный запрос JPA 2.0 следующим образом:
Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON");
List list = query.getResultList();
now list
имеет все строки, возвращаемые запросом. Я могу перебирать их, но каждая запись имеет Object[]
где:
- в индексе 0 Я нахожу NAME
- в индексе 1 Я нахожу ОТПРАВИТЬ
- по индексу 3 Я нахожу AGE
Кто-нибудь нашел способ сделать что-то вроде этого:
Map<String, Object> row = list.get(index);
String name = row.get("NAME");
String surname = row.get("SURNAME");
Integer age = row.get("AGE");
Мне понадобится это, так как выполняемый мной собственный запрос является динамическим, и я не знаю порядка поля в предложении SELECT, поэтому я не знаю, как будет выглядеть запрос:
SELECT SURNAME, NAME, AGE FROM PERSON
или
SELECT AGE, NAME, SURNAME FROM PERSON
или даже
SELECT AGE, SURNAME, NAME FROM PERSON
Ответы
Ответ 1
Какой JPA вы используете - Hibernate, EclipseLink или что-то еще?
Нет стандартного способа сделать это в JPA, но ваша конкретная реализация может это позволить - например, Eclipselink имеет подсказку типа результата запроса.
http://dev.eclipse.org/mhonarc/lists/eclipselink-users/msg03013.html
Query query = entityManager.createNativeQuery(sql);
query.setHint(QueryHints.RESULT_TYPE, ResultType.Map);
Для спящего режима с помощью javax.persistence.Query dbQuery:
org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery)
.getHibernateQuery();
hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
Ответ 2
Взгляните на это. Я получил его при работе над проектом, что я не мог использовать все функции JPA, поэтому я попробовал традиционный метод jdbc, даже если бы я не рекомендовал его, но он работал на меня.
@LocalBean
public class TCotisationEJB {
@PersistenceContext(unitName="ClaimsProjectPU")
private EntityManager em;
@TransactionAttribute(TransactionAttributeType.NEVER)
public List getCotisation(){
Query query=em.createNativeQuery("select Annee,Mois,RetSonarwa from TCotisMIFOTRA2008 where matricule='10000493' order by Annee");
List<Object[]> cotisation=query.getResultList();
Object[] cotisationData;
for(int i=0;i<cotisation.size();i++){
cotisationData=cotisation.get(i);
System.out.print("Annee: "+cotisationData[0]+" Mois :"+cotisationData[1]+" Amount :"+cotisationData[2]+"\n");
}
return query.getResultList();
}
}
Ответ 3
Как уже упоминалось, более старый JPA
не поддерживает его, однако у меня есть обходное решение с Postgres 9.4
в моей ситуации при работе с Jackson
,
List<String> list = em.createNativeQuery("select cast(json_object_agg(c.config_key,c.config_value) as text) from myschema.configuration c")
.getResultList();
Чтобы использовать его в слое Bean, используйте ниже метод, иначе напрямую возвращайтесь.
//handle exception here, this is just sample
Map map = new ObjectMapper().readValue(list.get(0), Map.class);
Несколько json-функций, https://www.postgresql.org/docs/9.4/static/functions-json.html. Я уверен, что вы можете найти то же самое для других баз данных.