我正在使用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之类的事情,但错误是一样的。
答案 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();