2016-08-18 105 views
2

一個查詢聯想我是很新,Hibernate Search的項目,所以任何建議將appriciated。假設我有一個實體美孚和實體一個一對多的關係連接酒吧。映射可能如下所示:取實體使用Hibernate Search的

@Entity 
@Table(name="foos") 
@Indexed 
public class Foo { 
    @Id 
    private Long id; 

    @IndexedEmbedded 
    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "bar_id") 
    private Bar bar; 

    //getters, setters, etc. 

} 

@Entity 
@Table(name = "bars") 
public class Bar { 
    @Id 
    private Long id; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy="bar") 
    private Set<Foo> fooSet; 

    //getters, setters, etc. 

} 

現在,當我試圖使用Lucene查詢美孚表/ Hibernate Search的DSL,我得到的結果是這樣的查詢:

select this_ from foos this_ where this_.id in (id collection fetched from lucene) 

所以我酒吧實體被由於懶惰的獲取類型,由hibernate代理。我的問題是有辦法使用一個查詢獲取酒吧(使用連接或其他)?

回答

2

最後,我已經找到了解決辦法。我們需要使用方法setCriteriaQuery(標準)FullTextQuery接口。來自javadoc:

定義用於加載Lucene結果的數據庫查詢。有用通過細化取模式無投影加載給定的對象圖(criteria.setProjection())允許的話,根實體必須是唯一的返回類型沒有限制,其中可以定義任意

所以,溶液看起來像這樣的:

FullTextQuery myQuery = ... //setup my lucene query here 
Criteria fetchAssociationCriteria = session.createCriteria(Foo.class); 
fetchAssociationCriteria.setFetchMode("bar", FetchMode.JOIN); 
List<Foo> foos = myQuery.setCriteriaQuery(fetchAssociationCriteria).getResultList(); 

將會產生查詢關鍵詞,比如:

select (foo and bar attributes) from foos this_ left outer join bar bars2_ where this.id in (id collection fetched from lucene) 

提示爲JPA用戶

FullTextQuery接口支持JPA,但您需要將Hibernate的標準查詢傳遞給setCriteriaQuery()方法。要獲得Hibernate的會話,請使用EntityManager的unwrap方法。

Session session = entityManager.unwrap(Session.class); 
+0

非常非常好答案!什麼是有趣的hibernate獲取他可以從索引(Id的),並在Id的他獲取協會什麼您定義。有趣。 – Gazeciarz

+0

我能夠在hibernate 4中使用setCriteriaQuery,但在hibernate中5個標準已被棄用。 我真的不知道如何結合全文查詢和setFetchMode – SG87