休眠Serone OneToMany混淆结果

时间:2018-09-28 09:59:37

标签: java

我在休眠搜索方面遇到问题。这有点复杂。我有一个名为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 ++思考”,有人可以帮助我吗?

1 个答案:

答案 0 :(得分: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();

我希望对您有帮助