Hibernate Search:如何查询父class中的字段?

Hibernate Search: how to query fields in parent class?

我正在尝试使用 Hibernate Search 进行查询。 我想匹配 Class 中从父项扩展的字段(子项 class 是 @Indexed 的)。

这是我到目前为止所做的。

-价格为指数class-

@Indexed
@Table(name = "price_products")
public class PriceEntity extends AbstractPrice {

    .....
    .....
    .....

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "productId")
    private ECommerceProductEntity parent;
    

    public ProductEntity getParent() {
        return parent;
    }

    public void setParent(ProductEntity parent) {
        this.parent = parent;
    }

    
}

-产品是父产品class-

@Entity
@Indexed
@Table(name = "products")
public class ProductEntity extends AbstractProduct {


    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    private List<PriceEntity> prices;

    /.others fields../


    @Field(termVector = TermVector.YES)
    @Size(max = 255)
    private String tags;

    /.others getter and setters../
    

    public String getTags() {
        return tags;
    }

    public void setTags(String tags) {
        this.tags = tags;
    }

    public List<PriceEntity> getPrices() {
        return prices;
    }

    public void setPrices(PriceEntity> prices) {
        this.prices = prices;
    }

    public void addPrice(ECommercePriceEntity price) {
        ...
    }

}

-AbstractProduct 由产品扩展-

@MappedSuperclass
public abstract class AbstractProduct {
    /.others fields../
    @NotBlank
    @Field(termVector = TermVector.YES)
    private String description;
    /getter end setters/
}

--查询--

FullTextEntityManager fullTextEntityManager
        = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();

FullTextEntityManager fullTextEntityManager2
        = Search.getFullTextEntityManager(entityManager);

QueryBuilder queryBuilder = fullTextEntityManager2.getSearchFactory()
        .buildQueryBuilder()
        .forEntity(PriceEntity.class)
        .get();

Query myQuery = queryBuilder
        .bool()
        .should(queryBuilder.keyword().withConstantScore()
                .onField("products.description").boostedTo(9l).matching(query)
                .createQuery())
        .should(queryBuilder.phrase().withConstantScore()
                .onField("products.description").boostedTo(5l).sentence(query)
                .createQuery())

        .should(queryBuilder.keyword().withConstantScore()
                .onField("products.tags").boostedTo(3l).matching(query)
                .createQuery())
        .should(queryBuilder.phrase().withConstantScore()
                .onField("products.tags").boostedTo(1l).sentence(query)
                .createQuery())
        .createQuery();

org.hibernate.search.jpa.FullTextQuery jpaQuery
        = fullTextEntityManager2.createFullTextQuery(myQuery, PriceEntity.class);
jpaQuery.setProjection("description");

List<PriceEntity> queryResults = jpaQuery.getResultList();

使用上面的代码我得到以下错误

org.hibernate.search.exception.SearchException: Unable to find field products.description in ... 

如果 queryBuilder 的给定实体是 PriceEntity,如何通过字段“描述”(在 AbstractProduct 中)和标签在(ProductEntity)中进行查询?

提前致谢

你应该使用 @IndexedEmbedded.

@Indexed
@Table(name = "price_products")
public class PriceEntity extends AbstractPrice {

    .....

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "productId")
    @IndexedEmbedded // <= ADD THIS
    private ECommerceProductEntity parent;
@Entity
@Indexed
@Table(name = "products")
public class ProductEntity extends AbstractProduct {


    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @ContainedIn // <= ADD THIS
    private List<PriceEntity> prices;

然后重新索引所有数据。

那就用“父”吧。如果要访问产品字段,查询价格时的前缀:

FullTextEntityManager fullTextEntityManager
        = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();

FullTextEntityManager fullTextEntityManager2
        = Search.getFullTextEntityManager(entityManager);

QueryBuilder queryBuilder = fullTextEntityManager2.getSearchFactory()
        .buildQueryBuilder()
        .forEntity(PriceEntity.class)
        .get();

Query myQuery = queryBuilder
        .bool()
        .should(queryBuilder.keyword().withConstantScore()
                .onField("parent.description").boostedTo(9l).matching(query)
                .createQuery())
        .should(queryBuilder.phrase().withConstantScore()
                .onField("parent.description").boostedTo(5l).sentence(query)
                .createQuery())

        .should(queryBuilder.keyword().withConstantScore()
                .onField("parent.tags").boostedTo(3l).matching(query)
                .createQuery())
        .should(queryBuilder.phrase().withConstantScore()
                .onField("parent.tags").boostedTo(1l).sentence(query)
                .createQuery())
        .createQuery();

org.hibernate.search.jpa.FullTextQuery jpaQuery
        = fullTextEntityManager2.createFullTextQuery(myQuery, PriceEntity.class);
jpaQuery.setProjection("parent.description");

List<PriceEntity> queryResults = jpaQuery.getResultList();

this section of the documentation