Hibernate: выберите N строк, но только с уникальными значениями в одном столбце - PullRequest
1 голос
/ 01 февраля 2012

Я хочу реализовать это с критериями Hibernate.

Допустим, у меня есть данные вроде (по ссылке):

ID  Name            City            Birthyear
1   Egon Spengler   New York        1957
2   Mac Taylor      New York        1955
3   Sarah Connor    Los Angeles     1959
4   Jean-Luc Picard La Barre        2305
5   Ellen Ripley    Nostromo        2092
6   James T. Kirk   Riverside       2233
7   Henry Jones     Chicago         1899

И я хочу реализовать это с помощью Hibernate (по ссылке):

SELECT P.*, COUNT(*) AS ct
   FROM people P
   JOIN (SELECT MIN(Birthyear) AS Birthyear
              FROM people 
              GROUP by City) P2 ON P2.Birthyear = P.Birthyear
   GROUP BY P.City
   ORDER BY P.Birthyear ASC 
   LIMIT 10;

Если у меня есть сущность:

@Entity
@Table(name = "people")
public class People {
    @Id
    private int id;

    @Column
    private String name;

    @Column
    private String city;

    @Column 
    int birthyear;
}

Тогда я могу составить критерий без самостоятельного соединения (это может не сработать):

Criteria criteria = sessionFactory.getCurrentSession()
   .createCriteria(People.class, "people")
   .setProjection(Projections.projectionList()
        .add(Projections.property("people.id"))
        .add(Projections.property("people.name"))
        .add(Projections.property("people.city"))
        .add(Projections.groupProperty("people.city)))
    .addOrder(Order.asc("people.birthyear"));

Как реализовать самостоятельное соединение?

1 Ответ

1 голос
/ 02 февраля 2012

Я пытался с HQL, и все еще немного сложнее, здесь вы можете найти детали.

Мне было проще (но, возможно, не так элегантно) сделать это с нативнымquery.

String hql="SELECT P.*, COUNT(*) FROM people P JOIN 
            (SELECT MIN(Birthyear) AS Birthyear FROM people GROUP by City) P2 ON P2.Birthyear = P.Birthyear
             GROUP BY P.City ORDER BY P.Birthyear ASC";

SQLQuery createSQLQuery = sessionFactory.getCurrentSession().createSQLQuery(hql);
List list = createSQLQuery.list();

Как я уже сказал, возможно, это не самое элегантное решение, но все же кажется более быстрым создание и выборка данных.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...