ORDER BY最大值,按分组

时间:2013-05-29 03:25:38

标签: mysql sql jpa criteria jpql

使用下表,

RECORD
---------------------
NAME            VALUE
---------------------
   Bill Clinton   100
   Bill Clinton    95
   Bill Clinton    90
Hillary Clinton    90
Hillary Clinton    95
Hillary Clinton    85
Monica Lewinsky    70
Monica Lewinsky    80
Monica Lewinsky    90

我可以使用JPA(JPQL或Criteria)选择以下输出吗?

   Bill Clinton   100
Hillary Clinton    95
Monica Lewinsky    90

我的意思是ORDER BY最多VALUENAME

3 个答案:

答案 0 :(得分:1)

查询本身

SELECT  Name,
        MAX(value) value
FROM    record
GROUP BY Name
ORDER BY Value DESC

输出:

|            NAME | VALUE |
---------------------------
|    Bill Clinton |   100 |
| Hillary Clinton |    95 |
| Monica Lewinsky |    90 |

<强> SQLFiddle

我不是jpa的专家,但这些行之间的某些东西可能会起作用

List<Object[]> results = entityManager
        .createQuery("SELECT  Name, MAX(value) maxvalue FROM record GROUP BY Name ORDER BY Value DESC");
        .getResultList();
for (Object[] result : results) {
    String name = (String) result[0];
    int maxValue = ((Number) result[1]).intValue();
}

答案 1 :(得分:1)

因为JPQL查询对实体起作用,所以假设遵循以下映射:

@Entity
@Table(name="your_table")
public class YourEntity {
    @Id private int id;
    private String name;
    private int value;
    ...
}

对于这样的映射,查询如下:

SELECT e.name, MAX(e.value)
FROM YourEntity e
GROUP BY e.name
ORDER BY MAX(e.value) DESC

此类查询的结果是对象数组列表。数组中的第一个元素是name,第二个元素是value(如select中所示)。

答案 2 :(得分:1)

使用标准:

CriteriaQuery<Person> q = cb.createQuery(Person.class);
Root<Person> p = q.from(Person.class);
q.select(p.get("name"), cb.max(p.get("value")));
q.groupBy(p.get("name"));
q.orderBy(cb.desc(cb.max(p.get("value"))));