2013-10-30 52 views
0

比方說,我有這個命名HQL(findRoomQuery):如何使用Hibernate Criteria Query選擇子級實體?

select r from House h inner join h.roomList r 
where h.address = :address and r.roomNo = :roomNo 

家實體的映射是這樣的:

<class name="com.example.House" table="house">  
    <id name="id" column="id" type="long"> 
     <generator class="assigned" /> 
    </id> 

    <property name="address" column="address" type="string" length="100" not-null="false"/> 
    <set name="roomList" cascade="none" lazy="false" fetch="join" inverse="true"> 
     <key> 
      <column name="house_id"/> 
     </key> 
     <one-to-many class="com.example.Room"/> 
    </set> 
</class> 

雖然房間實體是這樣的:

<class name="com.example.Room" table="room">   
    <id name="id" column="id" type="long"> 
     <generator class="assigned" /> 
    </id> 

    <property name="houseId" column="house_id" type="long" not-null="true"/> 
    <property name="roomNo" column="room_no" type="string" length="4" not-null="false"/> 
</class> 

關係是房子可以有一個或多個房間

執行查詢的代碼是這樣的:

Query query = getSession().createQuery("findRoomQuery") 
       .setParameter("address", address) 
       .setParameter("roomNo", roomNo); 
return query.list(); 

你可以看到從HQL 設定R(r爲h.roomList的別名)返回實體。

如何用Hibernate Criteria Query做同樣的事情? 這可能嗎?

+0

這是正確的嗎? 「關係是一個房子可以有一個或多個房間。」 VS「return(Room)query.uniqueResult()」; – Prabhakaran

+0

@ByteCode:對不起,這是錯字,我的意思是query.list()。 – null

+1

你正在搜索房間的ID基於房間,所以我認爲criteria.uniqueResult();是正確的。 – Prabhakaran

回答

0

試試這個

Criteria criteria = session.createCriteria(House.class, "house"); 
       criteria.createAlias("house.roomList", "roomList");   
       criteria.add(Restrictions.eq("house.address",address));    
       criteria.add(Restrictions.eq("roomList.roomNo", roomNo)); 
       criteria.setProjection(Projections.property("roomList")); 

      Room r = (Room) criteria.uniqueResult(); 

更換

<property name="houseId" column="house_id" type="long" not-null="true"/> 

<many-to-one name="houseId" class="com.example.House" fetch="select"> 
      <column name="house_id" not-null="true" /> 
</many-to-one> 
+0

我得到這樣的錯誤:「無法解析屬性:roomList:com.example.House」 – null

+0

您確定房子類包含屬性設置 roomList及其設置者和獲取者 – Prabhakaran

+0

@suud我剛剛將查詢替換爲條件select r from House h inner join h.roomList r where h.address =:address and r.roomNo =:roomNo – Prabhakaran

相關問題