2013-10-01 137 views
0

我是jpql的新手,我有以下情況。一對多查詢jpql

我有兩個實體地址和地址。

@Entity 
public class Place{ 


    @OneToMany 
    private List<Address> addresses; 

    .... 
} 

@Entity 
public class Address{ 

    String description; 

    Date dataFrom; 

    Date dataTo; 

    @ManyToOne 
    private Place place; 


    .... 
} 

我想得到最後一個地址的描述。 我試圖做到這一點:

select a.description from place p join p.addresses a..... 

,現在我應該按時間順序獲得最後的最後一個地址。 我該怎麼辦?

+0

是地址類有參考的地方。像@Entity 公共課地址{Place place} – Prabhakaran

+0

是的,我有一個雙向關聯 – Skizzo

+0

如果你還好吧,添加了答案.... else註釋確切的要求。 – Prabhakaran

回答

4
SELECT addresses.description 
FROM place p JOIN p.addresses addresses 
ORDER BY addresses.dateFrom 

然後返回這是一個resultList並獲得名單上的第一個項目,我會說你也許可以做到像在T-SQL SELECT TOP 1,但是,我不相信JPQL支持這一點。

+0

完美!謝謝你。 –

0
Criteria criteria = session.createCriteria(Place.class, "place"); 
    criteria.createAlias("place.addresses", "addresses") 
    criteria.add(Order.desc("addresses.dataFrom")); 
    criteria.setProjection(Projections.property("addresses")); 

    List<Address> addresses = criteria.list(); 

    for (Address address : addresses) { 
     System.out.println(address.description); 
    } 

如果你想找到基於地點ID使用下面一個地址的地址。

Criteria criteria = session.createCriteria(Place.class, "place"); 
    criteria.add(Restrictions.eq("place.id", put the place id here); 
    criteria.createAlias("place.addresses", "addresses") 
    criteria.add(Order.desc("addresses.dataFrom")); 
    criteria.setProjection(Projections.property("addresses")); 

    List<Address> addresses = criteria.list(); 

    for (Address address : addresses) { 
     System.out.println(address.description); 
    } 
1

嘗試使用子查詢,像

select a.description from place p join p.addresses a where a.dataFrom = (select max(address.dataFrom) from Address address where address.place = p)