java jpql distinct和检索许多字段

时间:2016-08-10 15:24:18

标签: java mysql eclipselink jpql

我在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

1 个答案:

答案 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]);
  }

这不是检索数据的最佳方式,但如果它符合您的需要,则无需执行更多操作。

  

我应该创建一个包含三个字段的自定义类吗?

如果在其他地方重复使用此自定义类,那么这样做很实用。否则,它看起来更像是开销。