2015-08-19 1 views
2

У меня есть модель ниже, и я пытаюсь использовать Hibernate Search для полнотекстового поиска.Запросить список IndexedEmbedded перечисления (enum) с помощью Hibernate Search

Мне нужно найти в поле «about» для всех пользователей с ролью UserRole.PROFESSIONIST.

Это модель:

@Entity 
@Indexed 
public class User 
{ 
    @Id 
    @GeneratedValue 
    Long id; 

    ... 

    String about; 

    @IndexedEmbedded 
    @Enumerated(EnumType.STRING) 
    @ElementCollection(targetClass = UserRole.class, fetch = FetchType.EAGER) 
    @JoinTable(name = "user_roles", joinColumns = {@JoinColumn(name = "user_id")}) 
    List<UserRole> roles = new ArrayList<>(); 
}  

Это запрос:

List results = new ArrayList<>(); 

org.apache.lucene.search.Query containText = queryBuilder 
    .keyword() 
    .onField("about") 
    .matching(text) 
    .createQuery(); 

org.apache.lucene.search.Query isProfessionist = queryBuilder 
    .keyword() 
    .onFields("roles") 
    .matching(UserRole.PROFESSIONIST.toString()) 
    .createQuery(); 

org.apache.lucene.search.Query query = queryBuilder 
    .bool() 
    .must(containText) 
    .must(isProfessionist) 
    .createQuery(); 

org.hibernate.search.jpa.FullTextQuery jpaQuery = fullTextEntityManager.createFullTextQuery(query, User.class); 

results = jpaQuery.getResultList(); 

Когда я выполнить запрос, я получаю эту ошибку:

org.hibernate.search.exception.SearchException: Unable to find field roles in com.plusimple.core.models.User 

Это то, что я пытаясь сделать это? И если да, что я делаю неправильно?

ответ

3

Поскольку целевой класс представляет собой перечисление, вам нужно добавить аннотацию @Field к объекту, который вы хотите использовать для поиска (это не нужно делать при вложении полных объектов, поскольку у них есть свои собственные дочерние свойства, которые быть доступным для поиска).

Пример:

@IndexedEmbedded 
@Field(name="roles", analyze=Analyze.NO, index=Index.YES) 
@Enumerated(EnumType.STRING) 
@ElementCollection(targetClass = UserRole.class, fetch = FetchType.EAGER) 
@JoinTable(name = "user_roles", joinColumns = {@JoinColumn(name = "user_id")}) 
List<UserRole> roles = new ArrayList<>(); 
+1

Он работал. Спасибо! –

+1

Хорошо, я открыл https://hibernate.atlassian.net/browse/HSEARCH-1971, чтобы улучшить это. Благодаря! – Sanne