休眠搜索-索引ManyToOne关系

时间:2020-09-08 08:25:37

标签: hibernate lucene hibernate-search

我有两个索引实体

@Entity @Indexed
public class AEntity implements {

    @Id
    private String externalId;

    @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
    private Set<BEntity> bEntities;
    
}

@Entity @Indexed
public class BEntity {

    @JsonIgnore @ManyToOne
    @IndexedEmbedded(depth = 1)
    @JoinColumn(name = "externalId", updatable = false)
    private AEntity aEntity;
    
}

现在,当我像这样搜索BEntity时:

private QueryBuilder getQuery() {
    FullTextEntityManager fullTextEntityManager = getFullTextEntityManager();
    return fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(BEntity.class).get();
}
    
Query query = getQuery().bool()
                .must(getQuery().keyword().onField("aEntity.externalId").matching(externalId).createQuery())
                .createQuery();

我遇到以下错误:

在BEntity中找不到字段aEntity.externalId

1 个答案:

答案 0 :(得分:1)

@IndexedEmbedded默认不包含ID字段。

您对文档ID字段的操作有一些限制,所以我个人建议您定义一个与文档ID分开的实际字段。这样一来,您就可以放心地对其进行排序,标准化或其他任何操作:

@Entity @Indexed
public class AEntity implements {

    @Id
    @DocumentId(name = "docId") // CHANGE HERE
    @Field // CHANGE HERE
    private String externalId;

    @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
    private Set<BEntity> bEntities;
    
}

@Entity @Indexed
public class BEntity {

    @JsonIgnore @ManyToOne
    @IndexedEmbedded(depth = 1)
    @JoinColumn(name = "externalId", updatable = false)
    private AEntity aEntity;
    
}

但是,如果您确实要使用文档ID字段,则可以使用@IndexedEmbedded(includeEmbeddedObjectId = true)

@Entity @Indexed
public class AEntity implements {

    @Id
    private String externalId;

    @OneToMany(cascade = CascadeType.ALL) @JoinColumn(name = "externalId")
    private Set<BEntity> bEntities;
    
}

@Entity @Indexed
public class BEntity {

    @JsonIgnore @ManyToOne
    @IndexedEmbedded(depth = 1, includeEmbeddedObjectId = true) // CHANGE HERE
    @JoinColumn(name = "externalId", updatable = false)
    private AEntity aEntity;
    
}

别忘了在更改注释后重新索引数据。