簡體   English   中英

Hibernate映射:HQL多對一查詢 - 如何檢索交叉pojo對象的屬性

[英]Hibernate mapping : HQL many-to-one Query - how to retrieve attributes of crossed pojo objects

我是一個使用Hibernate 4.3(xml風格)的初學者,當我不僅詢問pojo元素時,我仍然堅持查詢的方式。 我的意思......(見下一個例子)

我有兩張桌子:人和地址。 在表Person中,我有一個引用Adress的外鍵'id_adress_fk'。 在表Adress中,我將'id'作為主鍵,將'Adress_Street_Name'作為屬性。 一位參與者只能擁有一個地址。 一個地址有幾個人住在那里。 我寫了兩個Pojos課。

我正在嘗試請求數據庫具有Person屬性和Adress Street Name。 但我無法檢索Adress Street Name。 我不明白返回什么對象,如何編寫匹配返回的好對象的好查詢。 我必須在地址和人之間建立聯系嗎? 但在這種情況下返回的對象是什么? 我怎么處理這個?

非常感謝。

我的pojos:

public class Person implements Serializable  {

private Integer id;
private Adress adress;

    // getters and setters

public class Adress implements Serializable {

private Integer id;
private Set<Person> persons   = new HashSet<Person>(0);

    // getters and setters

我的映射:

ADRESS.HBM.XML

    <set name="persons" table="person" inverse="true" lazy="false" >

        <key>
            <column name="id_adress_fk" not-null="true"  />
        </key> 
        <one-to-many class="com.you.know.what.Person" />
</set>

PERSON.HBM.XML

    <many-to-one name="adress" class="you.know.what.Adress" >
        <column name="id_adress_fk" not-null="true" /> 
    </many-to-one>  

我的查詢(例如):

 List<Person> allPerson = getSessionFactory().getCurrentSession().createQuery( "from Person ").list();

我知道我只查詢Pojo Person,但是Adress對象被“包含”在Person中,所以我應該成功檢索Adress_street_name ......這樣做可能很棒!

根據Hibernate的默認提取策略,當您加載實體時,默認情況下不會加載關聯的實體(或映射到此實體的集合)。 因此,當您加載Person列表時:

( "from Person ").list()

將不會加載關聯的Address實體,而是加載Addressproxy proxy是映射的持久化類( Address )的運行時生成的子類的占位符實例,它將所有方法調用委托給從數據庫中懶惰地獲取的另一個Address實例。

要初始化代理,您需要打開Session並將對象附加到它。 這意味着當您已經結束工作單元並關閉Session或者從中分離對象時,Hibernate不再能夠獲取數據。

但您可以在運行時在代碼中覆蓋此默認提取策略; 這樣,只要需要,您就可以加載Person及其Address

getSessionFactory().getCurrentSession().createQuery( "from Person p left join fetch p.adress").list();

使用此查詢,您將獲得Person列表及其Address

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM