带有关联枚举字段的休眠搜索的查询结果

时间:2018-11-21 23:06:12

标签: java lucene hibernate-search

我正在尝试为具有以下关联的实体建立文档索引:

DocVersion:

@Entity
@Indexed
public class DocVersion implements Serializable {
...
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "doc_uuid")
    @IndexedEmbedded
    private Document2 document2;
...
}

文档2:

@Entity
@Indexed
public class Document2 implements Serializable {
...
    @Column(name = "entityState")
    @Enumerated(EnumType.STRING)
    @Field(bridge=@FieldBridge(impl=EnumBridge.class), index=Index.YES)
    private EDocState eDocState;
...
}

这是我查询索引的方式(仅出于测试目的):

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
        try {
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        QueryBuilder queryBuilder = fullTextEntityManager.getSearchFactory()
                .buildQueryBuilder()
                .forEntity(DocVersion.class)
                .get();

        org.apache.lucene.search.Query luceneQuery = queryBuilder.keyword()
                .onField("document2.eDocState").matching("HARD_DEL")
                .createQuery();
List results = fullTextEntityManager.createFullTextQuery(luceneQuery, DocVersion.class)
                .getResultList();

但我没有得到结果:

WARNING: org.hibernate.search.bridge.BridgeException: Exception while calling bridge#objectToString
    entity class: com.nws.vedica.model.entity.DocVersion
    entity property path: document2.eDocState
    field bridge: TwoWayString2FieldBridgeAdaptor [stringBridge=org.hibernate.search.bridge.builtin.EnumBridge@60942b8b]

那是什么意思?我是否需要为枚举实现一些特定的桥梁(看起来如何)? 这只是值枚举,所以我认为问题出在其他地方。

请协助我获得结果。

我正在使用的软件包: hibernate-search-orm:5.9.3。

1 个答案:

答案 0 :(得分:0)

您不需要实现特定的桥,实际上恰恰相反:桥已经存在,因此Hibernate Search希望您将枚举值传递给查询,而您要传递字符串值。

尝试将.matching("HARD_DEL")替换为.matching(EDocState.HARD_DEL)

注意:我怀疑其余的堆栈跟踪信息会告诉您有关类强制转换异常的信息,该异常可能使您失望。出于您自己的考虑,您可能不应该这样隐藏堆栈跟踪,堆栈跟踪可能包含有价值的信息。