【问题标题】:java jpql distinct and retrieve many fieldsjava jpql distinct并检索许多字段
【发布时间】:2016-12-17 02:04:40
【问题描述】:

我在 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 将 ClassCastException 返回到 HashMap。

如何检索这些结果? 我应该创建一个包含三个字段的自定义类吗? 如果正确,将返回什么月份和年份?

P.S.:我正在使用 jdk 1.8、jpa 2.1、mysql 和 eclipselink

【问题讨论】:

    标签: java mysql eclipselink jpql


    【解决方案1】:

    您可以通过键入查询的预期结果来检索结果。 一种通用的方法是表明您要检索 Object[] 的列表。
    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]);
      }
    

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

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

    如果这个自定义类在其他地方重用,这样做是很实用的。否则,它看起来更像是一种开销。

    【讨论】:

      猜你喜欢
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-05
      • 2015-05-06
      相关资源
      最近更新 更多