2011-01-13 32 views
1

我有一個用Java設置的實體類,具有與另一個類的多對多關係。但是,我不想選擇整個實體集合,而只想從子實體中選擇一個屬性。這樣做的原因是它會降低加載到系統中的數據量,因爲根據我的觀點,我並不總是需要整個實體。如何從休眠關係中的實體中選擇屬性

這是我到目前爲止有:

@Entity 
public class Disposition { 
... 
    @ManyToMany 
    private List<Project> projects; 
... 
} 

這工作得很好,並檢索工程實例的列表。但是,我不想獲得處置的所有項目;我只想檢索Project.name。

唯一的解決辦法,我已經能夠拿出迄今使用@Formula註解,但我想如果可能避免這種情況,因爲它需要編寫本地SQL,而不是HQL。

這種觀點是隻讀的,所以我不希望任何對數據的變化是持久的。

回答

2

可以使用hql只得到孩子的名字。它看起來像

"select p.name from Project p where p.parent_id = ?" 

你將不得不定製變量名稱,並使用參數化查詢來替換?與父母的身份。

是很常見的有確切這種情況量身定製的DAO方法。

0

這是對象關係映射無法幫助你的地方。但是你可以使用Query API,它允許通過HQL查詢任意對象,而不是SQL。不是@Formula也使用HQL嗎?

0

這是不是休眠,但ebean project可能會介入你。 Ebean是一個ORM項目,它使用JPA註釋並允許對象的惰性(部分)加載。

在你的榜樣,只得到項目名稱將導致該代碼:

List<Project> projects = Ebean.find(Project.class) 
    .select("name") // Only name properties are loaded 
    .where().eq("disposition", yourDisposition) 
    .findList(); 

然後,如果你試圖讓項目業主(或每其他財產),論文的屬性將是懶惰的Ebean加載。

0

檢出org.hibernate.criterion.Projections。給定一個標準,你可以簡單地做到以下幾點:

criteria.setProjection(Projections.property("name"));