我在mysql中有这个查询:
select distinct Month(date), year(date), field3
from table
我写了这段代码:
Query q = em.createQuery(
"select distinct function('month',t.date) as month, function('year',t.date) as year, field3 as field3 from Table t"
);
我尝试将结果转换为HashMap<String, String>
但jpql从Object返回HashMap {/ 1}}。
如何检索这些结果? 我应该创建一个包含三个字段的自定义类吗? 如果它是正确的,那么月和年会返回什么?
P.S。:我使用jdk 1.8,jpa 2.1,mysql和eclipselink
答案 0 :(得分:1)
您可以通过键入查询的预期结果来检索结果。 通用方法是指示您要检索对象列表[] List对应于请求返回的每一行,Object []包含每行返回的值。对象的排序顺序与返回的值相同。
不需要别名,因为结果中没有使用。所以我删除它们。
并且您不应该从表名查询,否则它看起来像SQL本机查询(可以使用JPA),但您应该在FROM子句中指定实体名称。所以我根据原则对其进行了修改
这里修改了查询并处理了结果:
TypedQuery<Object[]> query = em.createQuery(
"select distinct function('month',t.date) ,
function('year',t.date) , field3 from YourEntity t", Object[].class);
List<Object[]> results = query.getResultList();
for (Object[] result : results) {
System.out.println("month: " + result[0] + ", year: " + result[1]
+ ", field3:"+ result[2]);
}
这不是检索数据的最佳方式,但如果它符合您的需要,则无需执行更多操作。
我应该创建一个包含三个字段的自定义类吗?
如果在其他地方重复使用此自定义类,那么这样做很实用。否则,它看起来更像是开销。