2013-01-09 70 views
0

有沒有辦法只使用標準部分獲取關聯的關聯實體部分ManyToOne條件獲取@ManyToOne部分關係

我有以下的情況下

@Entity 
public class Foo { 
    @ManyToOne(optional = false, fetch = FetchType.LAZY) 
    private Bar bar; 
    // getters/setters and lots other attributes 
} 

@Entity 
public class Bar { 
    private String name; 
    @OneToMany(fetch = FetchType.EAGER) 
    private Collection<ComplexObject> complexObjects; 
    // getters/setters 
} 

而且我有一個Criteria選擇所有我Foo的,我想用它一起只獲取與之相關的Barname。我不想將ComplexObject的集合加載在一起。有沒有辦法做到這一點,而無需修改Bar

我想這是因爲我想展現給用戶類似

 Foo.Attr1, Foo.Attr2, Foo.Bar.Name 

回答

1

不,這是不可能的。當你將一個集合標記爲真正獲取時,它總是被熱切地提取。如果你想懶惰地加載,它應該被標記爲懶惰。

但你可以選擇你的只有三個屬性:

Criteria c = session.createCriteria(Foo.class, "foo"); 
c.createAlias("foo.bar", "bar"); 
c.setProjection(Projections.projectionList().add(Projections.property("foo.attr1")) 
              .add(Projections.property("foo.attr2")) 
              .add(Projections.property("bar.name"))); 

或者,更可讀:

String hql = "select foo.attr1, foo.attr2, bar.name from Foo foo" 
      + " inner join foo.bar bar"; 
+0

約不讓收集懶惰收集我所知道的部分。但你回答了我的問題:)這是我需要的投影。 –

+0

有沒有辦法讓Hibernate將這個投影列表映射到Foo? –

+0

有一種方法,使用ResultTransformer,但它非常髒。返回實體實例的方法應該返回實體實例,尊重它們的不變量和契約,附加到會話等。不是一些半滿的對象。 –