PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Kế thừa JPA @EntityGraph bao gồm các liên kết tùy chọn của các lớp con

Bạn chỉ có thể sử dụng EntityGraph nếu thuộc tính liên kết là một phần của lớp cha và thuộc tính đó cũng là một phần của tất cả các lớp con. Nếu không, EntityGraph sẽ luôn không thành công với Exception mà bạn hiện đang nhận được.

Cách tốt nhất để tránh vấn đề chọn N + 1 của bạn là chia truy vấn của bạn thành 2 truy vấn:

Truy vấn đầu tiên tìm nạp MCValue các thực thể sử dụng EntityGraph để tìm nạp liên kết được ánh xạ bởi selected thuộc tính. Sau truy vấn đó, các thực thể này sau đó được lưu trữ trong bộ đệm ẩn cấp 1 của Hibernate / ngữ cảnh liên tục. Hibernate sẽ sử dụng chúng khi nó xử lý kết quả của truy vấn thứ 2.

@Query("SELECT m FROM MCValue m") // add WHERE clause as needed ...
@EntityGraph(attributePaths = {"selected"})
public List<MCValue> findAll();

Sau đó, truy vấn thứ 2 tìm nạp Answer thực thể và sử dụng EntityGraph cũng để tìm nạp Value được liên kết các thực thể. Đối với mỗi Value thực thể, Hibernate sẽ khởi tạo lớp con cụ thể và kiểm tra xem bộ đệm ẩn cấp 1 đã chứa một đối tượng cho tổ hợp khóa chính và lớp đó chưa. Nếu đúng như vậy, Hibernate sử dụng đối tượng từ bộ đệm ẩn cấp 1 thay vì dữ liệu được trả về bởi truy vấn.

@Query("SELECT a FROM Answer a")
@EntityGraph(attributePaths = {"value"})
public List<Answer> findAll();

Bởi vì chúng tôi đã tìm nạp tất cả MCValue các thực thể có selected được liên kết các thực thể, bây giờ chúng ta nhận được Answer các thực thể có giá trị value được khởi tạo sự kết hợp. Và nếu liên kết chứa MCValue thực thể, selected của nó liên kết cũng sẽ được khởi tạo.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres:\ sao chép lỗi cú pháp trong tệp .sql

  2. Tại sao tất cả các cơ sở dữ liệu đều có một lược đồ công khai trong PostgreSQL?

  3. Truy vấn Rails .where () không hoạt động

  4. Đính kèm DANH SÁCH phân vùng vào bảng hiện có trong postgres 11

  5. Không thể sử dụng người dùng postgres trong cơ sở dữ liệu mới cho rails 3 trên máy chủ ubuntu 10.04