2014-10-03 1 views
0

У меня есть следующий поиск спящего режима отображения:Список 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

ответ

3

Нет, вы не можете. Вы не можете сохранить порядок элементов списка. Кроме того, если имена полей будут отличаться, как вы предлагаете, как бы вы узнали, какие поля будут нацелены на ваш запрос?

Вы можете написать собственный мост, в этом случае вы можете добавить произвольные имена полей. Я просто упомянул об этом для полноты. Я бы не рекомендовал кодировать порядок списка в именах полей. Может быть, вы могли бы объяснить свой вариант использования и что и как вы хотите запросить? Могут быть другие способы добиться того, что вам нужно.

И последнее, но не менее важное: если в ваших классах нет циклической ссылки, aka 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);