簡體   English   中英

Eager fetch在hibernate中執行left join但在springboot / JPA中觸發單獨的sql查詢

[英]Eager fetch performs left join in hibernate but fires seperate sql queries in springboot/JPA

我看到很多帖子,其中Eager fetch在hibernate中執行子表父表的左連接。 但是當我使用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 eager fetch不加入

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 ,因此您實際上應該使用findByIdfindOne方法(取決於您的Spring Data JPA版本)。 這將使用EntityManager.find ,它應該考慮映射信息並創建適當的查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM