我在休眠搜索方面遇到问题。这有点复杂。我有一个名为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: 预订客户地址
一旦我想搜索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 ++思考”,有人可以帮助我吗?
答案 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();
我希望对您有帮助