【问题标题】:Fetch entity with association using one query in hibernate search在休眠搜索中使用一个查询获取具有关联的实体
【发布时间】:2016-08-18 18:35:13
【问题描述】:

我对 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 search dsl 查询 Foo 表时,我得到如下查询结果:

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

所以我的 Bar 实体由于延迟获取类型而被休眠代理。我的问题是有没有一种方法来获取 FooBar 使用一个查询(使用连接或其他)?

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

    我终于找到了解决方案。我们需要使用来自FullTextQuery 接口的方法setCriteriaQuery(Criteria)。来自 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);
    

    【讨论】:

    • 非常非常好的答案!有趣的休眠是从索引(Id)中获取他所能得到的,并在 Id 上获取您定义的关联。很有趣。
    • 我能够在休眠 4 中使用 setCriteriaQuery,但在休眠 5 中,条件已被弃用。我真的不知道如何结合全文查询和 setFetchMode
    • 我在 Hibernate Search 6.0.0.Beta2 中看不到任何实现相同目的的方法。
    • Hibernate Search 6 文档中此部分的标题听起来很有希望:docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多