在hibernate搜索中使用一个查询获取具有关联的实体

时间:2016-08-18 18:35:14

标签: java hibernate lucene hibernate-search

我对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 吗?

1 个答案:

答案 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);