如何在hibernate搜索上的ManytoOne Join字段中应用where子句?

时间:2012-11-21 05:12:41

标签: hibernate lucene hibernate-search

我有一个产品表,它包含名称 SKU 描述产品字段category (与产品类别表的多对一关系)。我使用Hibernate Search索引产品并编写了以下代码来执行搜索:

FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search
            .getFullTextEntityManager(getEntityManager());
QueryBuilder qb = fullTextEntityManager.getSearchFactory()
            .buildQueryBuilder().forEntity(Product.class).get();

    org.apache.lucene.search.Query query = qb.keyword().fuzzy()
            .onFields("name", "sku", "uniqueid", "description")
            .matching(value).createQuery();
    javax.persistence.Query persistenceQuery = fullTextEntityManager
            .createFullTextQuery(query, Product.class);

现在我想在产品类别中添加where条件。例如,我想只搜索productCategory.Id = 101的产品。

有人能建议我怎么做吗?

谢谢&问候 维杰

1 个答案:

答案 0 :(得分:2)

这样的事情应该有效(你需要使用 bool 组合查询):

Query fuzzyQuery = qb.keyword()
    .fuzzy()
    .onFields("name", "sku", "uniqueid", "description")
    .matching(value)
    .createQuery();

Query categoryQuery = qb.keyword()
    .onField("productCategory.Id")
    .matching("101")
    .createQuery();

Query luceneQuery = qb
    .bool()
      .should( fuzzyQuery )
      .must( categoryQuery )
    .createQuery();

像这样的东西。这取决于您实际配置的具体方式。实际上,在制作示例时,您应该讨论实体而不是表格,并且应该为已注释的实体发布代码。