我运行JPA 2.0本机查询,如下所示:
Query query = em.createNativeQuery("SELECT NAME, SURNAME, AGE FROM PERSON");
List list = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
现在list拥有查询返回的所有行.我可以迭代它们,但每个条目都在Object[]哪里:
- 在索引0我找到了NAME
- 在索引1处,我找到了SURNAME
- 在索引3我找到了AGE
有没有人找到办法做这样的事情:
Map<String, Object> row = list.get(index);
String name = row.get("NAME");
String surname = row.get("SURNAME");
Integer age = row.get("AGE");
Run Code Online (Sandbox Code Playgroud)
我需要这个,因为我执行的本机查询是动态的,我不知道SELECT子句中字段的顺序,所以我不知道id的查询将如下所示:
SELECT SURNAME, NAME, AGE FROM PERSON
Run Code Online (Sandbox Code Playgroud)
要么
SELECT AGE, NAME, SURNAME FROM PERSON
Run Code Online (Sandbox Code Playgroud)
甚至
SELECT AGE, SURNAME, NAME FROM PERSON
Run Code Online (Sandbox Code Playgroud)
wrs*_*der 16
您使用的是哪个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);
Run Code Online (Sandbox Code Playgroud)
对于Hibernate,使用javax.persistence.Query dbQuery:
org.hibernate.Query hibernateQuery =((org.hibernate.jpa.HibernateQuery)dbQuery)
.getHibernateQuery();
hibernateQuery.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
正如其他人已经提到的,较旧的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();
Run Code Online (Sandbox Code Playgroud)
要在Bean层使用它,请使用以下方法,否则直接返回。
//handle exception here, this is just sample
Map map = new ObjectMapper().readValue(list.get(0), Map.class);
Run Code Online (Sandbox Code Playgroud)
更多 json 函数,https://www.postgresql.org/docs/9.4/static/functions-json.html。我相信您可以在其他数据库中找到相同的内容。
| 归档时间: |
|
| 查看次数: |
50481 次 |
| 最近记录: |