这是我的实体:
public class PersonItem implements Serializable{
@Id
@Column(name="col1")
private String guid;
@Column(name="col2")
private String name;
@Column(name="col3")
private String surname;
@Column(name="col4")
private Date birthDate;
//+getters and setters
}
这是我如何得到的人的名单:
Query query = em.createQuery("Select p from PersonItem p WHERE p.guid IN (:guids)");
EntityGraph<PersonItem> eg = em.createEntityGraph(PersonItem.class);
eg.addAttributeNodes("guid");
eg.addAttributeNodes("name");
eg.addAttributeNodes("surname");
query.setHint("javax.persistence.fetchgraph", eg);
query.setParameter("guids", guids);
List<PersonItem> list=query.getResultList();
em.close();
// And now I iterate result AFTER EM CLOSE
....iterate
如果我正确理解fetch graph,它必须只加载我指定的字段。但是,“生日”字段也会被加载。此外,我看到在hibernate sql查询中选择了4列。
如何修复它?我使用Hibernate5.1.0作为JPA提供程序。
实体图旨在控制哪些关系(例如一对一、一对多等)是延迟加载的还是急切加载的。它们可能无法加载单个列(这取决于提供程序)。
Hibernate对此有一定的支持,但是要开始工作相当困难,这里描述了。然而,他们提到了对这种方法的以下沉默(我完全同意):
请注意,这主要是一个营销功能;优化行读取比优化列读取重要得多。
因此,在确认这确实是应用程序中的一个瓶颈之前,我不建议在这条路上走得太远(例如,这种获取调优可能是过早优化的症状)。
更新:
正如所指出的,JPA确实让提供者决定是否延迟获取简单列(非关联)。
急切策略是持久性提供程序运行时的一项要求,即必须急切地获取数据。延迟策略是对持久性提供程序运行时的一个提示,即在首次访问数据时,应该延迟获取数据。允许实现急切地获取指定了延迟策略提示的数据。特别是,延迟抓取可能仅适用于使用基于属性的访问的基本映射。
从Hibernate 5开始,添加了对字节码增强的官方支持,这可能允许延迟属性获取。
根据最新的Hibernate文档,我们有:
2.3.2
fetch-FetchType(默认为EAGER)
定义该属性是应立即获取还是延迟获取。JPA表示,对于提供者(Hibernate)来说,急切是一个要求,即在获取所有者时应该获取值,而懒惰只是一个提示,提示在访问属性时获取值。Hibernate会忽略基本类型的此设置,除非您使用字节码增强。
下面这段代码描述字节码增强的优点。
懒惰属性加载
可以将其视为部分加载支持。本质上,您可以告诉Hibernate,在从数据库获取实体时,只应该加载实体的一部分,而其他部分也应该加载。请注意,这与基于代理的懒惰加载思想非常不同,懒惰加载是以实体为中心的,实体的状态根据需要立即加载。通过字节码增强,单个属性或属性组根据需要加载。
问题内容: 这是我的实体: 这是我获得人员名单的方式: 如果我正确理解提取图,则它必须仅加载我指定的那些字段。但是,字段“ birthDate”也已加载。此外,我看到在hibernateSQL查询中选择了4列。 如何解决?我使用hibernate 5.1.0作为JPA提供程序。 问题答案: 实体图旨在控制延迟或渴望加载哪些关系(例如,一对一,一对多等)。它们可能不适用于加载各个列(取决于提供程序)
问题内容: 我有一个实体,该实体与另一个用@Where注释的实体有关联,就像这样 最近不可避免的事情发生了,我需要加载不符合@Where子句的EntityB。我可以删除@Where批注,但是它使用很多,所以理想情况下,我不想这样做。除了手动加载EntityB列表之外,还有另一个查询,我还有哪些选择?我可以告诉Hibernate忽略@Where注释吗? 问题答案: 经过大量研究,这似乎是不可能的。我
问题内容: 这个问题本质上是相反的这一个 我有这样的方法: 当我加载它时,Hibernate抱怨我没有称为的属性。但是我不想要一个叫做-我不需要存储数据的属性-这仅仅是逻辑。 hibernate状态: org.hibernate.PropertyNotFoundException:在com.mycomp.myclass类中找不到空置属性的设置器… 我可以在方法中添加注释以使Hibernate忽略它
在对一个与另一个有一对一关系的实体执行jpql查询时,我遇到了一个意外的行为。关键的一点是,关系是从根实体的主键到目标实体的一个字段,而目标实体不是ID。
问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc
问题内容: 您好,我正在阅读hibernate文档。 http://docs.jboss.org/hibernate/annotations/3.5/reference/zh/html/entity.html 使用@ManyToMany批注在逻辑上定义了多对多关联。您还必须使用@JoinTable批注描述关联表和联接条件。如果关联是双向的,则一侧必须是所有者,而一侧必须是反向端(即,在更新关联表中