繁体   English   中英

休眠:选择N行,但在一列中仅包含唯一值

[英]Hibernate: Select N rows, but with only unique values in one column

我想用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"));

如何实现自我加入部分?

我尝试过HQL,但仍然有些复杂, 在这里您可以找到详细信息。

我发现使用本机查询更容易(但可能不太优雅)。

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

就像我说的那样,也许这不是最优雅的解决方案,但似乎创建和获取数据的速度仍然更快。

希望能帮助到你

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM