休眠搜索一对多混淆结果

问题描述 投票:0回答:1

我在休眠搜索方面遇到问题。这有点复杂。我有一个名为Book的实体,它与另一个名为SaleLog的实体具有OneToMany关系。 SaleLog具有以下属性:saleDate(DateTime),amount(int),customer(string),address(string)。像这样的代码:

@Indexed
class Book {
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "book_id")
     @IndexedEmbedded(includePaths = {"customer", "address"})
     private List<SaleLog> saleLogs;
      ...
}

class SaleLog {
     int bookId;
     DateTime saleDate;
     int amount;

     @Field
     string customer;
     @Field
     string address;
}

这里是salelog:预订客户地址

  • “用Java思考”杰克·巴黎
  • “用Java思考”汤姆·伦敦
  • “在C ++中思考” Jack London

[一旦我想搜索Jack From London购买的书,我就这样使用Hibernate搜索:

Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
MustJunction term = qb.bool().must(qb.keyword().onField("saleLogs.customer").matching("Jack").createQuery());
term.must(qb.keyword().onField("saleLogs.address").matching("London").createQuery())
List<Book> books = fullTextSession.createFullTextQuery(term.createQuery()).list();

并且我得到了“用Java思考”和“用C ++思考”。

java
1个回答
0
投票

我不知道此API的工作原理,但令我感到困扰。似乎createQuery创建了MustJunction的新实例。您只需要将构建器的结果放在变量中>>

像这样:

 MustJunction term = qb.bool().must(qb.keyword().onField("saleLogs.customer").matching("Jack").createQuery());

 term = term.must(qb.keyword().onField("saleLogs.address").matching("London").createQuery())
 List<Book> books = fullTextSession.createFullTextQuery(term.createQuery()).list();

希望对您有帮助

© www.soinside.com 2019 - 2024. All rights reserved.