Hibernate - 使用在运行时定义的字段加载实体
Hibernate - load entities with fields defined at runtime
假设我们有一些实体,它有 10 个字段。让我们假设几乎所有这些领域都有非常大的数据。我们想要加载实体(而不是字段集!)并在运行时定义要加载的字段。我找到的解决方案 建议使用构造函数。但是如果有 10 个字段并且有必要在运行时定义字段是不可能的解决方案。有没有办法使用 jpa 2.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();
使用 JPA 2.1 EntityGraph 定义查询要检索的字段。因此,如果您有一个 class 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();
Fetch 图表主要针对提取关联,而不针对单个字段。
即使 JPA 规范规定字段在默认情况下应该是惰性的,但 LAZY 只是对 JPA 提供者的提示,他们可能会选择忽略它。
默认情况下,Hibernate 不对字段使用延迟加载。默认只有 one-to-many and many-to-many associations are LAZY。
要拥有惰性字段,您需要 enable bytecode enhancement 并且可能还需要使用 @LazyGroup。
无论如何,也许 DTO projection query 就是您首先需要的。
假设我们有一些实体,它有 10 个字段。让我们假设几乎所有这些领域都有非常大的数据。我们想要加载实体(而不是字段集!)并在运行时定义要加载的字段。我找到的解决方案 建议使用构造函数。但是如果有 10 个字段并且有必要在运行时定义字段是不可能的解决方案。有没有办法使用 jpa 2.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();
使用 JPA 2.1 EntityGraph 定义查询要检索的字段。因此,如果您有一个 class 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();
Fetch 图表主要针对提取关联,而不针对单个字段。
即使 JPA 规范规定字段在默认情况下应该是惰性的,但 LAZY 只是对 JPA 提供者的提示,他们可能会选择忽略它。 默认情况下,Hibernate 不对字段使用延迟加载。默认只有 one-to-many and many-to-many associations are LAZY。
要拥有惰性字段,您需要 enable bytecode enhancement 并且可能还需要使用 @LazyGroup。
无论如何,也许 DTO projection query 就是您首先需要的。