我看到很多帖子,其中Eager fetch在休眠状态下执行子表父表的左连接。但是当我使用springboot时,hibernate会触发单独的sql查询-
意味着一个针对父表的选择查询和一个针对子表的选择查询。为什么有区别?springboot是否进行了升级,或者我做错了什么?
以下是我正在使用的实体:
订单实体:
@Entity
@Table(name="Ordertable", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class Order {
@Id
@Column(name = "ORDER_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int orderId;
@Column(name = "DAT_SRC_ID")
private String dataSourceId;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
private Customer customer;
}
客户实体:
@Entity
@Table(name="Customer", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class Customer {
@Id
@Column(name = "CUSTOMER_ID")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long customerId;
@Column(name = "CUSTOMER_NAME")
private String customer_name;
@Column(name = "CUSTOMER_address_id")
private int customer_address_id;
@Column(name = "DAT_SRC_ID")
private String dataSourceId;
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
private List<Order> order;
}
控制器:
@RequestMapping(value="/getByCustid/{id}", method=RequestMethod.GET,produces=MediaType.APPLICATION_JSON_VALUE)
public Customer getByCustid (@PathVariable Long id) {
Customer s1 = customerRepository.findByCustomerId(id);
return s1;
}
仓库:
public interface CustomerRepository extends JpaRepository<Customer,Long> {
public Customer findByCustomerId(Long customerId);
}
以下是正在执行的查询:
select
customer0_.CUSTOMER_ID as CUSTOMER1_0_,
customer0_.CUSTOMER_address_id as CUSTOMER2_0_,
customer0_.CUSTOMER_NAME as CUSTOMER3_0_,
customer0_.DAT_SRC_ID as DAT_SRC_4_0_
from
Customer customer0_
where
customer0_.CUSTOMER_ID=?
select
order0_.ORDER_CUSTOMER_ID as ORDER_CU3_5_0_,
order0_.ORDER_ID as ORDER_ID1_5_0_,
order0_.ORDER_ID as ORDER_ID1_5_1_,
order0_.ORDER_CUSTOMER_ID as ORDER_CU3_5_1_,
order0_.DAT_SRC_ID as DAT_SRC_2_5_1_
from
Ordertable order0_
where
order0_.ORDER_CUSTOMER_ID=?
编辑:这与@Fetch(FetchMode.JOIN)有关-
链接:JPA渴望获取不加入
Hibernate:Hibernate对Fetch模式Eager进行的多个选择查询
为了检查FetchMode.JOIN是否正常工作,我在实体中添加了FetchMode.JOIN,如下所示,但Join Query仍然没有成功:
客户实体:
@Entity
@Table(name="Customer", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class Customer {
@OneToMany(fetch=FetchType.EAGER)
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
@Fetch(FetchMode.JOIN)
private List<Order> order;
}
订单实体:
@Entity
@Table(name="Ordertable", schema="cf_2583f365_c3c6_499a_a60d_138e7e7023eb")
public class Order {
@JsonIgnore
@ManyToOne()
@JoinColumn(name = "ORDER_CUSTOMER_ID", referencedColumnName = "CUSTOMER_ID")
@Fetch(FetchMode.JOIN)
private Customer customer;
}
在findByCustomerId
基于该方法,而不是使用实际上会生成一个查询em.find
。它将按照的方式创建一些东西SELECT c FROM Customer c WHERE c.customerId=:customerId
。之后,它将注意到获取策略并获得所需的引用。这也在这里解释。该查询将完全按照您的指示执行操作。
如果您要急于加载引用,则需要自己按照编写查询SELECT c FROM Customer c JOIN FETCH c.orders o WHERE c.customerId=:customerId
,这将自动检索订单。
但是,customerId
实际上是实体的主键或标识符,因此,您实际上应该使用findById
or findOne
方法(取决于Spring
Data
JPA版本)。这将使用,EntityManager.find
后者应考虑映射信息并创建适当的查询。
问题内容: 我有一个我认为应该很普遍的问题,但找不到答案。 我有2个对象:组和用户。我的课程如下所示: 现在,当我尝试从数据库中获取用户时,它带来了所有组,所有组都带来了所有用户,依此类推。最后,我遇到了stackoverflow异常。 如何解决此问题,并且仍然具有双向关联以及到达列表中对象的能力? 问题答案: 如果使用属性(无论如何都应使用)将双向关联的一侧设为关联的 拥有 侧,是否会遇到相同的
我有两个表,一个用于聚会,一个用于记分卡模板映射。记分卡模板映射表有一个返回到party(on id)的外键。我想找到一个有记分卡模板映射细节的所有各方的列表。
问题内容: 我有一个Hibernate的服务方法,例如:。securityId2由用户传递。每个SecurityContact与一个Contact有多对一的关系,因此Hibernate在运行此查询时会自动调用联接。但是,Hibernate始终运行的联接是内部联接,因此无法正常运行。有没有办法强迫Hibernate在内部生成左外部联接?这是SecurityContact类的代码: 问题答案: 尝试多
问题内容: 我有一个实体A,它具有-B实体,而B具有-A与@OneToOne双向关联。 现在,当我找到所有A记录时,hibernate使用B上的左外部联接执行两个查询,如下所示: 第一次查询会加载A和B字段,但可以,但是为什么要执行第二次查询来重新加载A?我认为此查询将B中的A内容加载,但此A显然是包含B的A …因此它已经加载了第一个查询,不是吗? -编辑- 实体A: 实体B: 就是这种情况,在A
问题内容: sess.createSQLQuery(“INSERT INTO ARCHIVE (folder) VALUES(:folder)”) .setParameter(“folder”,path) .executeUpdate(); 我想要新创建对象的ID。我怎样才能做到这一点? 问题答案: 试试吧 Integer lastId = (Integer) session.createSQLQ
问题内容: 我有两个实体:和。我正在使用Hibernate 3.6。 如何使用hibernate标准实现这一目标,最重要的是,我必须将其用于分页。 而“我的道”如下所示以显示jqgrid中的“问题”列表 公共列表showHelpDeskIssues(DetachedCriteria dc,int from,int size){ 问题答案: 您可以尝试以下 这里parent是中的属性名称,child