休眠搜索-索引ManyToOne关系

问题描述

我有两个索引实体

@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

解决方法

@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;
    
}

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...