2013-04-22 2 views
0

Я использую Hibernate-поиск для поиска данных в приложении Jboss. У меня есть 3 класса сущностей JPA, которые расширяют класс BaseEntity и каждый индексируется Lucene. Например:Hibernate поиск по любому индексированному объекту

@MappedSuperclass 
public abstract class BaseEntity implements Serializable { 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date created; 
    public abstract Long getId(); 
} 

@Entity 
@Table(name = "DVD") 
public class Dvd extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Field 
    private String title; 
} 

@Entity 
@Table(name = "BOOK") 
public class Book extends BaseEntity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @Field 
    private String author; 
} 

Теперь я хотел бы искать либо DVD названия или книги автора по шаблону поисковый запрос и получить список результатов в виде списка. Это то, что у меня есть:

public List<BaseEntity> search(String query, int firstResult, int maxResults) { 
    List<BaseEntity> results = null; 
    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em); 
    Query luceneQuery = new WildcardQuery(new Term("*", "*" + query + "*")); 
    FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, BaseEntity.class); 
    fullTextQuery.setFirstResult(firstResult); 
    fullTextQuery.setMaxResults(maxResults); 
    results = fullTextQuery.getResultList(); 
    return results; 
} 

Но с этим я не получаю никаких результатов. Как можно заставить это работать или существует даже путь без использования buildQueryBuilder для каждого объекта? Благодаря!

ответ

1

Вы хотите использовать метод переменных аргументов стиля для классов, например, так:

FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, DVD.class, Book.class); 

Это происходит потому, что, когда Hibernate Search создает поисковый запрос, он добавляет имя (ы) класса к query (для поля _hibernate_class, которое является именем проиндексированного класса).