2016-03-04 2 views
2

Say У меня есть модель А как это:Hibernate: как аннотирования Collection <Object>, чтобы поиск

@Embeddable 
class A { 
    @Field 
    private String name; 
    @Field 
    private Boolean editable; 
    @IndexedEmbedded 
    private B bObject; 
} 

где, Б, скажем

@Embeddable 
class B { 
    @Field 
    private int intValue; 
    @Field 
    private boolean boolValue; 
} 

Теперь у меня есть класс C,

@Entity 
class C { 

    //How to annotate this to enable search like setOfA.name="searchQuery", or setOfA.bObject.intValue=5 
    @ElementCollection 
    private Set<A> setOfA; 
} 

Я вижу, что я могу создать пользовательский мост, но не могу понять, что должен сделать мост, особенно, чтобы включить поиск l ike setOfA.bObject.intValue = 5.

Любая помощь приветствуется. Благодарю.

ответ

1

Вот работает Exemple:

@ElementCollection 
@Field(name="listStringField") 
@FieldBridge(impl=BuiltinIterableBridge.class)//ListStringBridge.class) 
public List<String> getListString(){ 
    return listString; 
} 
  • @Field (имя ...) определяет для поиска поле.
  • @FieldBridge позволяет моему списку быть доступным для поиска, но для этого вам необходимо точно определить, какой мост вы хотите использовать. Мост - это то, что сделает поле индексируемым.
  • BuiltinIterableBridge, этот мост изначально присутствует в пакетах Hibernate Search. Все, что вам нужно сделать, это просто использовать его!
  • ListStringBridge. Мост, который я создал, который расширяет IterableBridge. Вы можете написать свой собственный.
0

использование @ContainedIn над коллекции объектов, как:

@ContainedIn 
private Set<A> setOfA; 

И использовать @IndexedEmbedded над другой стороны, как:

@Embeddable 
class A { 
    @Field 
    private String name; 
    @Field 
    private Boolean editable; 
    @IndexedEmbedded 
    private B bObject; 

    @OneToOne(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) 
    @IndexedEmbedded 
    private C cObject; 
} 
+0

Вы можете использовать OneToOne согласно вашему требованию, это всего лишь образец. – Atul

+0

Спасибо Атул за предложение, я пробовал это, но получаю 'Caused by: org.hibernate.MappingException: не удалось определить тип для com. *. C, at table: C_setOfA, для столбцов: [org.hibernate.mapping.Column (setOfA.forC)] 'exception. –

+0

Это ошибка сопоставления спящего режима, не связанная с поиском спящего режима – Atul

0

Вам нужно добавить @OneToMany или @ManyToMany, так что это правильно сопоставлена ​​ассоциация по условиям JPA , Затем добавьте @IndexedEmbedded, чтобы включить полнотекстовый поиск в Hibernate Search.

+0

Спасибо Gunnar за предложение. Фактически я использовал @ElementCollection, поскольку A является встраиваемым объектом. С '@ElementCollection @IndexedEmbedded private Set setOfA' только один объект из setOfA индексируется (я думаю, что другие перезаписываются). –