0

以下の表で、

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 or Criteria)で以下の出力を選択することはできますか?

   Bill Clinton   100
Hillary Clinton    95
Monica Lewinsky    90

つまり、ORDER BY最大VALUEグループNAME.

4

3 に答える 3

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 |

SQLフィドル

私は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();
}
于 2013-05-29T03:35:10.643 に答える
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

このようなクエリの結果は、オブジェクト配列のリストです。配列の最初の要素は名前で、2 番目の要素は値です (select と同様)。

于 2013-05-29T03:56:02.773 に答える
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"))));
于 2013-05-29T03:56:10.077 に答える