2014-10-03 33 views
0

我有以下Hibernate Search的映射:IndexedEmbedded列表 - 添加元素索引字段名稱

public class Courrier { 

    @IndexedEmbedded(depth = 2) 
    @OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL) 
    @OrderBy("id") 
    private List<CourrierClassification> classifications; 

指數化是確定的,但字段名的列表中的每個條目相同:

classifications.id 
classifications.id 
... 

是有辦法的元素索引追加到字段名,這樣我可以differenciate條目(順序事項)

classifications1.id 
classifications2.id 
.... 
+0

沒有得到你! 字段名稱將始終相同,其值不同。請問您是否可以共享CourrierClassification的代碼? – Atul 2014-10-06 04:30:42

回答

3

不,你不能。您無法保留列表元素的順序。另外,如果字段名稱會因您的建議而有所不同,您如何知道在查詢中要定位哪些字段?

您可以編寫一個自定義橋,在這種情況下您可以添加任意字段名稱。我只是提到完整性。我不建議將列表順序編碼到字段名稱中。也許你可以解釋你的用例,以及你想查詢的內容和方式?可能還有其他方法可以實現你的目標。

最後但並非最不重要的一點,除非您的課程中存在循環參考,否則CourrierClassification再次參考Courrier,因此不需要depth屬性。

0

我用一個FieldBridge來添加具有自定義名稱的字段到文檔中。有用。

@Field 
    @FieldBridge(impl = ClassificationFieldBridge.class) 
    @OneToMany(mappedBy = "courrier", cascade = CascadeType.ALL) 
    @OrderBy("id") 
    private List<CourrierClassification> classifications; 

場橋默認地將Impl:

public class ClassificationFieldBridge implements FieldBridge { 

     @Override 
     public void set(String name, Object value, Document luceneDocument, LuceneOptions luceneOptions) { 
     ...... 
List<CourrierClassification> listClassifications = (List<CourrierClassification>) value; 
     int i = 1; 
     for (CourrierClassification courrierClassification : listClassifications) { 
      ValeurGenerique valeurGenerique = courrierClassification.getValeur(); 

      Field field = new Field(name + i + ".valeur.rechercheLuceneNonTokenise", valeurGenerique.getRechercheLucene(), Field.Store.NO, Field.Index.NOT_ANALYZED); 
      luceneDocument.add(field);