使用下表,
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
最多VALUE
组NAME
。
答案 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"))));