2014-10-03 66 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);