Hibernate - 使用在运行时定义的字段加载实体

时间:2016-05-05 11:23:51

标签: java hibernate jpa orm lazy-loading

假设我们有一个实体,它有10个字段。让我们假设几乎所有这些领域都有非常大的数据。我们想要加载实体(不是字段集!)并在运行时定义要加载的字段。我找到的解决方案https://stackoverflow.com/a/24710759/5057736建议使用构造函数。但是在10个字段的情况下,有必要在运行时定义字段是不可能的解决方案。有没有办法如何使用jpa 2.1来解决这个问题?

3 个答案:

答案 0 :(得分:2)

使用JPA 2.1 EntityGraph定义查询要检索的字段。因此,如果您有一个类MyClass,并且想要动态检索特定字段,那么这样就足够了

EntityGraph<MyClass> eg = em.createEntityGraph(MyClass.class);
eg.addAttributeNodes("id");
eg.addAttributeNodes("name");
eg.addAttributeNodes("relation");

Query q = em.createQuery("SELECT b FROM MyClass b");
q.setHint("javax.persistence.fetchgraph", eg);
List<MyClass> results = q.getResultList();

答案 1 :(得分:1)

使用Hibernate会话,可以通过使用结果转换器来获得。 Hibernate不支持JPA的结果转换器。

HHH-8196 Custom ResultTransformer for JPA criteria queries

您可以使用unwrap(Session.class)将结果转换器应用于会话。

List<Person> persons = entityManager.unwrap(Session.class).
    createQuery("select name as name from Person").
    setResultTransformer(
        Transformers.aliasToBean(Person.class)
    ).list();

Additional information about nested projections

答案 2 :(得分:1)

获取图主要针对获取关联,而不是针对单个字段。

即使JPA规范说默认字段应该是懒惰的,LAZY只是JPA提供商的提示,可能会选择忽略它。 默认情况下,Hibernate不对字段使用延迟加载。默认情况下仅one-to-many and many-to-many associations are LAZY

要拥有惰性字段,您需要enable bytecode enhancement并且也可以使用@LazyGroup。

无论如何,首先你可能需要DTO projection query