2012-02-01 86 views
1

我想用Hibernate标准实现this休眠:选择N行,但在一列中只有唯一值

比方说,我有这样(从链接)数据:

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

如何实现自连接部分?

+0

不取笑,但你为什么不使用HQL因为我要动态地添加更多的限制,它的更简单 – 2012-02-01 05:26:51

+0

。 HQL不好。不过,如果你以HQL的方式给我答案,我会很感激。 – 2012-02-01 05:46:15

+0

@桑多,你好哥们..我想你现在可能已经得到了这个问题的答案。如果没有,让我知道,我会尽我所能。但我的另一个问题,根据此评论http://stackoverflow.com/posts/comments/51993306?noredirect=1,他说你写的'AlianToBeanNestedResultTransformer'为'一对多(又名集合)'的关系。如果所以,你能分享一下吗?我为'OneToMany'集合绝望的'AliasToBeanNestedResultTransformer' .. – 2015-08-17 16:06:12

回答

1

我用HQL试过了,仍然有点复杂,here你可以找到细节。

我发现它更容易(但可能不那么优雅)与本机查询。

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

就像我说的,也许它不是最优雅的解决方案,但创建和获取数据看起来似乎更快。

希望它可以帮助