2017-05-04 67 views
1

我有以下兩個簡單的類,其是示例性我的問題的結構:直接裝入嵌入類而不嵌入類嗎啡

第一類,其中嵌入了第二個

@Entity 
public class MyClass { 
    @Id 
    private String myClassName; 
    private String otherField; 
    @Embedded 
    private List<MyEmbedded> myEmbeddeds; 
} 

和將被嵌入第二類:

@Embedded 
public class MyEmbedded { 
    @Id 
    private String name; 
    private String some; 
    private String other; 
} 

在現實情況下,這兩個類有一個更爲複雜的結構,有很多的字段,並引用。 因此,我不想加載整個MyClass對象,因爲在大多數情況下,我只需要MyEmbedded列表中的一個特定元素(大多數情況下只具有隻讀訪問權限)。

另一方面,將MyEmbedded類設置爲簡單引用是沒有選擇的,因爲我們對MyClass有一些複雜的查詢,而這些查詢嚴重依賴於myEmbeddeds,這意味着我們將不得不執行多個查詢,不想要。

所以,主要的問題是:

我如何可以加載myEmbeddeds列表中的一個特定元素直接作爲MyEmbedded對象,而不加載「父」 -object?

也許有使用AggregationPipeline的方法? (您可以在pipeline.aggregate()方法中定義一個「目標」類,並且可以在morphia的測試中找到一些示例,因爲您可以看到here,但我沒有爲我的案例工作)

回答

0

您可以基於MyEmbedded的屬性查詢MyClass,然後使用投影從結果中僅拉動myEmbeddeds

+0

但是,這也會加載和映射列表中包含的任何其他'myEmbedded'對象,而不僅僅是我需要的一個(最耗時的部分來獲取MyClass對象將花費在該列表上) – pthum