我对Hibernate Search项目很陌生,因此任何建议都会受到关注。假设我有一个实体 Foo ,实体 Bar 与一对多关系相关联。映射可能如下所示:
@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搜索dsl查询Foo表时,我得到如下结果查询:
select this_ from foos this_ where this_.id in (id collection fetched from lucene)
因为lazy fetch类型,我的 Bar 实体被hibernate代理。我的问题是有一种方法可以使用一个查询(使用连接或其他)获取 Foo 和 Bar 吗?
答案 0 :(得分:2)
最后我找到了解决方案。我们需要使用FullTextQuery接口中的方法 setCriteriaQuery(Criteria)。来自javadoc:
定义用于加载Lucene结果的数据库查询。通过细化提取模式来加载给定的对象图非常有用。不允许使用projection(criterion.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的解包方法。
Session session = entityManager.unwrap(Session.class);