Java Hibernate-加载在运行时定义了字段的实体

Java Hibernate-加载在运行时定义了字段的实体,java,hibernate,jpa,orm,lazy-loading,Java,Hibernate,Jpa,Orm,Lazy Loading,假设我们有一个实体,它有10个字段。让我们假设几乎所有这些字段都有非常大的数据。我们希望加载实体(而不是字段集!),并在运行时定义要加载的字段。我找到的解决方案建议使用构造函数。但在10个字段的情况下,在运行时定义字段是不可能的解决方案。有没有办法使用JPA2.1解决这个问题?通过Hibernate会话,可以通过使用结果转换器来实现这一点。Hibernate不支持JPA的结果转换器 您可以使用unwrap(Session.class)将结果转换器应用于会话 List<Person>

假设我们有一个实体,它有10个字段。让我们假设几乎所有这些字段都有非常大的数据。我们希望加载实体(而不是字段集!),并在运行时定义要加载的字段。我找到的解决方案建议使用构造函数。但在10个字段的情况下,在运行时定义字段是不可能的解决方案。有没有办法使用JPA2.1解决这个问题?

通过Hibernate会话,可以通过使用结果转换器来实现这一点。Hibernate不支持JPA的结果转换器

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

List<Person> persons = entityManager.unwrap(Session.class).
    createQuery("select name as name from Person").
    setResultTransformer(
        Transformers.aliasToBean(Person.class)
    ).list();
List persons=entityManager.unwrap(Session.class)。
createQuery(“选择姓名作为个人姓名”)。
SETRESULT变压器(
Transformers.aliasToBean(Person.class)
).list();

使用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();
EntityGraph eg=em.createEntityGraph(MyClass.class);
例如,添加属性节点(“id”);
例如,添加属性节点(“名称”);
例如,添加属性节点(“关系”);
Query q=em.createQuery(“从MyClass b中选择b”);
q、 setHint(“javax.persistence.fetchgraph”,例如);
List results=q.getResultList();

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

即使JPA规范说默认情况下字段应该是惰性的,惰性也只是JPA提供者的一个提示,他们可能会选择忽略它。 默认情况下,Hibernate不会对字段使用延迟加载。只有在默认情况下

要拥有惰性字段,您需要并且可能还需要使用@LazyGroup


无论如何,也许a是您首先需要的。

让我们假设您使用JPA EntityGraphs?@Neil Stockton我认为EntityGraphs仅用于显示要加载的实体,而不用于显示其字段。不。定义要加载的字段。然而,它有缺点,因为您不能明确地说不要加载字段X@Neil斯托克顿,谢谢。您能否举例说明如何在JPQL查询中使用未命名实体图?我会接受你的回答。但是,默认情况下,所有字段都已加载。那么,我如何在默认情况下禁用加载所有字段?这就是“fetchgraph”与“loadgraph”的不同之处,请参见注释中的链接。。。请参阅JPA规范第3.7.4节,如果是这种情况,那么您的JPA提供商将单方面决定根据您的意愿加载该字段(即仅将fetchgraph作为建议)。我使用的JPA提供者(DataNucleus)尊重我的意愿,这正是EntityGraph应该做的事情。如果你对这个话题感兴趣的话,请投赞成票,并不是说我对它特别感兴趣;-)我遇到过太多的地方,Hibernate做自己的事情,而不是遵循JPA的意图,并且从来没有计划回到它。祝你好运