【问题标题】:Hibernate Search - indexed ManyToOne relationHibernate Search - 索引多对一关系
【发布时间】:2020-12-26 14:36:27
【问题描述】:

我有两个索引实体

@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

【问题讨论】:

    标签: hibernate lucene hibernate-search


    【解决方案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;
        
    }
    

    不要忘记在更改注释后重新索引您的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2011-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多