gpt4 book ai didi

jquery - Hibernate Search:如何查询父类中的字段?

转载 作者:行者123 更新时间:2023-12-03 01:15:35 38 4
gpt4 key购买 nike

我正在尝试使用Hibernate Search进行查询。
我想匹配一个从父级扩展的类中的字段(子类是@Indexed一个)。
到目前为止,这是我所做的。
-价格是索引的类别-

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


}
-产品是父类-
@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;
然后重新索引所有数据。
然后使用“ parent ”。如果要访问产品字段,则在查询价格时添加前缀:
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

关于jquery - Hibernate Search:如何查询父类中的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62691860/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com