[英]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.