无法使用 Hibernate Search 搜索 child 实体
Unable to search on child entity using Hibernate Search
我在 name
字段上的以下 Master
实体上使用 Hibernate。它工作顺利。但是,我也想搜索它的 child
实体 SubMaster's
subName
字段。
我添加了 @IndexedEmbedded
和 @ContainedIn
注释,如 Hibernate Search 文档中所述。但是,它返回空
当我尝试在 subName
.
上搜索时
@Entity
@Indexed
@Table(name = "master", catalog="mydb")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", unique = true, nullable = false)
private Integer seq;
@Column(name = "name", length = 45)
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "master")
@IndexedEmbedded
private Set<SubMaster> subMasters = new HashSet<SubMaster>(0);
//Getters and Setters
}
@Entity
@Table(name = "sub_master", catalog="mydb")
public class SubMaster implements java.io.Serializable {
@Id
@Column(name = "seq", unique = true, nullable = false)
private Integer seq;
@Column(name = "sub_name", length = 45)
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String subName;
@ManyToOne(fetch = FetchType.EAGER)
@ContainedIn
private Master master = new HashSet<Master>(0);
//Getters and Setters
}
搜索码:
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Master.class).get();
org.apache.lucene.search.Query query = qb
.keyword()
.wildcard()
.onFields("name", "subMasters.subName")
.matching("*"+token.toLowerCase()+"*")
.createQuery();
javax.persistence.Query jpaQuery =
fullTextEntityManager.createFullTextQuery(query, Master.class);
@SuppressWarnings("unchecked")
List<Master> result = jpaQuery.getResultList();
正在建立索引:
姓名
_hibernate_class
任何正确方向的帮助将不胜感激。提前致谢。
不确定是否打字错误但是:
.onFields("name", "subMaster.subName")
应该是:
.onFields("name", "subMasters.subName")
在 "subMasters" 末尾有一个 s。
当你遇到这种情况的时候,和Luke(https://github.com/DmitryKey/luke/releases)一起看看你的索引,会有很大的帮助。
感谢所有试图帮助我的人。但是,我自己想出了问题。我使用 hibernate tools
从我的数据库生成实体,生成的实体在 @Table
注释中有一个属性 catalog
。
我删除了这个 catalog
属性并重新索引了我的实体并在 subMasters.subName
上执行了搜索并且它非常有效。
我在 name
字段上的以下 Master
实体上使用 Hibernate。它工作顺利。但是,我也想搜索它的 child
实体 SubMaster's
subName
字段。
我添加了 @IndexedEmbedded
和 @ContainedIn
注释,如 Hibernate Search 文档中所述。但是,它返回空
当我尝试在 subName
.
@Entity
@Indexed
@Table(name = "master", catalog="mydb")
public class Master implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "seq", unique = true, nullable = false)
private Integer seq;
@Column(name = "name", length = 45)
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String name;
@OneToMany(fetch = FetchType.EAGER, mappedBy = "master")
@IndexedEmbedded
private Set<SubMaster> subMasters = new HashSet<SubMaster>(0);
//Getters and Setters
}
@Entity
@Table(name = "sub_master", catalog="mydb")
public class SubMaster implements java.io.Serializable {
@Id
@Column(name = "seq", unique = true, nullable = false)
private Integer seq;
@Column(name = "sub_name", length = 45)
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String subName;
@ManyToOne(fetch = FetchType.EAGER)
@ContainedIn
private Master master = new HashSet<Master>(0);
//Getters and Setters
}
搜索码:
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
.buildQueryBuilder().forEntity(Master.class).get();
org.apache.lucene.search.Query query = qb
.keyword()
.wildcard()
.onFields("name", "subMasters.subName")
.matching("*"+token.toLowerCase()+"*")
.createQuery();
javax.persistence.Query jpaQuery =
fullTextEntityManager.createFullTextQuery(query, Master.class);
@SuppressWarnings("unchecked")
List<Master> result = jpaQuery.getResultList();
正在建立索引:
姓名 _hibernate_class
任何正确方向的帮助将不胜感激。提前致谢。
不确定是否打字错误但是:
.onFields("name", "subMaster.subName")
应该是:
.onFields("name", "subMasters.subName")
在 "subMasters" 末尾有一个 s。
当你遇到这种情况的时候,和Luke(https://github.com/DmitryKey/luke/releases)一起看看你的索引,会有很大的帮助。
感谢所有试图帮助我的人。但是,我自己想出了问题。我使用 hibernate tools
从我的数据库生成实体,生成的实体在 @Table
注释中有一个属性 catalog
。
我删除了这个 catalog
属性并重新索引了我的实体并在 subMasters.subName
上执行了搜索并且它非常有效。