2013-05-29 26 views
0

用下表分組,ORDER BY最大與

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或標準),選擇下面的輸出?

Bill Clinton 100 
Hillary Clinton 95 
Monica Lewinsky 90 

我的意思是,ORDER BY最大VALUE組由NAME

回答

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(); 
} 
+0

「*使用JPA(JPQL或標準)*」? – eggyal

+0

@eggyal更新了答案 – peterm

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 

結果是對象陣列的列表。數組中的第一個元素是名稱,第二個元素是值(如select中)。

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"))));