java - 忽略关系中的 FetchType.EAGER

标签 java hibernate jpa hql jpql

我对大型应用程序中的 EAGER 关系有疑问。此应用程序中的某些实体与其他实体具有 EAGER 关联。这在某些功能中成为“毒药”。

现在我的团队需要优化此功能,但我们无法将提取类型更改为 LAZY,因为我们需要重构整个应用程序。

那么,我的问题是:有没有办法在我返回的实体中忽略 EAGERs 关联来执行特定查询?

示例:当我有这个实体Person 时,我不想在查询Person 时带上地址列表。

@Entity
public class Person {

  @Column
  private String name;

  @OneToMany(fetch=FetchType.EAGER)
  private List<String> address;

}

Query query = EntityManager.createQuery("FROM Person person");
//list of person without the address list! But how???
List<Person> resultList = query.getResultList();

谢谢!

更新

我发现的唯一方法是不返回实体,只返回实体的一些字段。但我想找到一个可以返回实体的解决方案(在我的示例中,Person 实体)。

我正在考虑是否可以在 Hibernate 中映射同一张表两次。这样,我可以在没有 EAGER 关联的情况下映射同一个表。这将在某些情况下对我有所帮助...

最佳答案

如果您使用的是 JPA 2.1(Hibernate 4.3+),您可以使用 @NamedEntityGraph 实现您想要的。

基本上,您会像这样注释您的实体:

@Entity
@NamedEntityGraph(name = "Persons.noAddress")
public class Person {

  @Column
  private String name;

  @OneToMany(fetch=FetchType.EAGER)
  private List<String> address;

}

然后使用提示获取没有地址的人,如下所示:

EntityGraph graph = this.em.getEntityGraph("Persons.noAddress");

Map hints = new HashMap();
hints.put("javax.persistence.fetchgraph", graph);

return this.em.findAll(Person.class, hints);

有关该主题的更多信息,请访问 here .

当您使用获取图时,只会急切地获取您放在 @NamedEntityGraph 中的字段。

在没有提示的情况下执行的所有现有查询将保持不变。

关于java - 忽略关系中的 FetchType.EAGER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17847289/

相关文章:

Java-to-sql语句,Insert into vs setString中的变量

eclipse - 使用 Eclipse 的 Postgres 的基本独立 JPA 示例

hibernate - JPA/Hibernate - 单向 OneToOne 关联上的反向连接?

jpa - CascadeType.Persist 不使用 JPA 中的主键生成器类型表

java - Hibernate复合键映射问题

java - 使用 CLOB 值更新 oracle 中的 clob 列

java - 在客户端(浏览器)的 Java EE Web 应用程序上播放音频

java - 获取大量随机推文

java - 如何在JSP中显示Spring Webflow的 "flowScope"的内容?

java - Hibernate for SQLite 支持 envers 吗?