2012-02-01 74 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(); 

就像我說的,也許它不是最優雅的解決方案,但創建和獲取數據看起來似乎更快。

希望它可以幫助