我在Master
字段上的name
实体上使用Hibernate。它工作顺利。但是,我也想搜索它的孩子
实体SubMaster's
subName
字段。
我添加了Hibernate Search文档中指定的@IndexedEmbedded
和@ContainedIn
注释。但是,它正在回归空虚
当我尝试搜索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
任何正确方向的帮助都将受到高度赞赏。提前谢谢。
答案 0 :(得分:1)
不确定是否是拼写错误,但是:
.onFields("name", "subMaster.subName")
应该是:
.onFields("name", "subMasters.subName")
在“subMasters”结尾处有一个s。
当你遇到这种情况时,用Luke(https://github.com/DmitryKey/luke/releases)查看你的索引,它可以帮到很多。
答案 1 :(得分:0)
感谢所有试图帮助我的人。但是,我自己已经找到了问题。我使用hibernate tools
从我的数据库生成实体,生成的实体在catalog
注释中有一个属性@Table
。
我删除了这个catalog
属性并重新编制了我的实体索引并在subMasters.subName
上执行了搜索,它就像魅力一样。