如何获取与hibernate搜索结果列表相关的对象?

How to get the object related to hibernate search result list?

我需要搜索在 elasticsearch 上索引的几个文档。搜索有效,但我需要知道 returns 搜索的对象类型。

public 列表搜索(字符串项){

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
    QueryBuilder authorQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Author.class).get();
    QueryBuilder postQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Post.class).get();
    QueryBuilder commentQB = fullTextEntityManager.getSearchFactory().buildQueryBuilder()
            .forEntity(Comment.class).get();

    Query authorLQ = authorQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(AUTHOR_FIELDS).matching(terms)
            .createQuery();

    Query postLQ = postQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(POST_FIELDS).matching(terms)
            .createQuery();

    Query commentLQ = commentQB
            .keyword().fuzzy().withEditDistanceUpTo(1).withPrefixLength(1)
            .onFields(COMMENT_FIELDS).matching(terms)
            .createQuery();

    Query luceneQuery = authorQB.bool()
            .should(authorLQ)
            .should(postLQ)
            .should(commentLQ)
            .createQuery();

    javax.persistence.Query jpaQuery = fullTextEntityManager.
            createFullTextQuery(luceneQuery, Author.class, Post.class, Comment.class);

    List<Object> result; // need to know object type

    try {
        result = jpaQuery.getResultList();
    } catch (NoResultException nre) {
        throw new NoResultException("The search for " + terms + " did not get any results");
    }

    return result;
}

这给了我所有对象的列表,但我需要确切地知道它是什么类型(作者,Post 或评论)。可以做到,谢谢。

您可以只使用 instanceof...但是如果您真的希望 Hibernate Search return 那样,您可以使用投影:

    FullTextQuery jpaQuery = fullTextEntityManager.
            createFullTextQuery(luceneQuery, Author.class, Post.class, Comment.class);
    jpaQuery.setProjection( ProjectionConstants.OBJECT_CLASS, ProjectionConstants.THIS );

    List<Object[]> results = jpaQuery.list();
    for ( Object[] result : results ) {
         Class<?> resultClass = result[0];
         Object resultObject = result[1];
         // ... do stuff ...
    }