如何使用hibernate lucene搜索具有多对一关系的实体

时间:2013-10-18 08:02:37

标签: lucene hibernate-search

我正在使用Hibernate lucene进行搜索。现在我想搜索一个具有多对一关系的实体

我有两个一级是catalogueBase而另一个是Subject,这里的主题有多对一的关系(它是单面关系)

catalogueBase.java类:

@Indexed
@JsonAutoDetect
@Entity
@Table(name="catalogueBase")
public class CatalogueBase extends BaseObject implements Serializable {

    // some entities
    // ...
    private Subject subject; 

    // setter and get methods 
    // ...

    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
    @ManyToOne
    @NotFound(action= NotFoundAction.IGNORE)
    @JoinColumn(name = "subject1", insertable = true, updatable=true, nullable = true)
    @JsonProperty
    public Subject getSubject() {
        return subject;
    }
    public void setSubject(Subject subject) {
        this.subject = subject;
    }
}

Subject.java(我想搜索关于主题的内容,它将存储在描述栏中):

@Indexed
@JsonAutoDetect
@Entity
@Table(name="subject")
public class Subject implements java.io.Serializable {

    private String description;

    // ...
    @Column(name = "subjectname", nullable = false, length = 150)
    public String getDescription() {
        return this.description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    // ....
}

这是我的DAO方法:

private List<CatalogueBase> searchTitle(String queryString) throws InterruptedException {
    Session session = getSession();
    FullTextSession fullTextSession = Search.getFullTextSession(session); 
    fullTextSession.createIndexer().startAndWait();
    org.hibernate.Query fullTextQuery = null;
    List<CatalogueBase> resultList = null;
    try{
        QueryBuilder queryBuilder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(CatalogueBase.class).get();
        org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("title","subject").matching(queryString).createQuery();     
        fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery, CatalogueBase.class);

        List<CatalogueBase> contactList = fullTextQuery.list();

        resultList = new ArrayList<CatalogueBase>();;

        for (CatalogueBase catalogueBase : contactList) {
            catalogueBase.setNoOfCopiesBooks(getCopydetailsCount(catalogueBase.getId()));
            catalogueBase.setIssuedCount(getIssuedCount(catalogueBase.getId()));
            resultList.add(catalogueBase);
        }
    } catch(Exception e) {
        e.printStackTrace();
    }

    return resultList;
}

但是它会出现如下错误:SearchException: Unable to find field subject in com.easylib.elibrary.model.CatalogueBase

我做了this post之类的事情,但错误是一样的。

1 个答案:

答案 0 :(得分:3)

我得到了解决方案。

我将发布代码......

@Indexed  // must
@JsonAutoDetect
@Entity
@Table(name="subject")
public class Subject implements java.io.Serializable {

    private String description;

    @ContainedIn   // must
    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.YES)
    @Column(name = "subjectname", nullable = false, length = 150)
    public String getDescription() {
        return this.description;
    }
}

在目录中:

    @ManyToOne
    @NotFound(action= NotFoundAction.IGNORE)
    @JoinColumn(name = "subject1", insertable = true, updatable=true, nullable = true)
    @JsonProperty
    @IndexedEmbedded   // must
    public Subject getSubject() {
        return subject;
    }
    public void setSubject(Subject subject) {
        this.subject = subject;
    }

在DAO中,它必须是:

org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword().onFields("subject.description").matching(queryString).createQuery();