无法使用Hibernate Search搜索子实体

时间:2017-08-24 14:13:31

标签: java hibernate jpa lucene hibernate-search

我在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

任何正确方向的帮助都将受到高度赞赏。提前谢谢。

2 个答案:

答案 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上执行了搜索,它就像魅力一样。