2

我正在使用 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

我做了类似这篇文章的事情,但错误是一样的。

4

1 回答 1

4

我得到了解决方案。

我只会贴代码...

@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();
于 2013-10-18T09:46:24.037 回答