簡體   English   中英

Hibernate-從聯接表中獲取數據

[英]Hibernate - Fetching data from joined table

請參閱以下關系:

Person {
    long idPerson;
    String name;

    @OneToMany( mappedBy="owner", cascade=CascadeType.ALL, fetch=FetchType.EAGER )
    List<Pet> pets;
}

@Inheritance( strategy=InheritanceType.JOINED )
Pet {
    long idPet;

    @ManyToOne
    @JoinColumn( name="ID_PERSON", nullable=false )
    Person owner;

    String name;
}

Cat extends Pet { }
Dog extends Pet { }
Dragon extends Pet { }

這不是完整的代碼,但是您可以理解...

如您所見, InheritanceType的策略為JOINED 。因此,例如,如果我要檢索所有具有CatPerson ,則我的SQL將像這樣:

SELECT * FROM PERSON, PET, CAT
    WHERE PERSON.ID_PERSON=PET.ID_PERSON AND PET.ID_PET=CAT.ID_PET

如何使用“標准”來做? 一個“替代方法”就是這樣..:

Criteria criteria = session.createCriteria( Cat.class ).list();
// then manually create a List<Person> and add all the Cat.owner to that list

如果我不需要應用某些限制,則對我來說這很好。

使用criteria.createAlias("Pet", "pet")無效,因為它將檢索所有Person無論它是否具有Cat 和..criteria.createAlias criteria.createAlias("Cat", "cat")甚至不會編譯,因為Person沒有Cat作為屬性。

簡而言之,我想達到的目標等同於:

SELECT * FROM PERSON, PET, CAT
    WHERE PERSON.ID_PERSON=PET.ID_PERSON AND PET.ID_PET=CAT.ID_PET
        AND PERSON.something=...
        AND PET.something=...
        AND CAT.something=... ( and a lot more... )

好吧,如果我使用TABLE_PER_CLASS策略,這本來可以容易得多,但是在我的真實項目中,JOINED是最適合的一種。

如果可能,出於某些“ ..復雜”的原因,我想避免使用HQL。

提前致謝!

試試這個,這是您可以在繼承中檢查類的方法。

Criteria criteria = session.createCriteria( Person.class).createAlias("pets", "pet").add(Restrictions.eq("pet.class", Cat.class));

暫無
暫無

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

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