2009-10-06 34 views
12

Tôi có một bản đồ ngủ đông như thế này trong một lớp ProductDfnHibernate mặc định tham gia cho nullable nhiều-to-one

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "productTypeFk", nullable = true) 
public ProductType getProductType() 
{ 
    return productType; 
} 

Lưu ý rằng mối quan hệ được định nghĩa là không bắt buộc (và cột là nullable).

Khi làm HQL một cái gì đó như thế này

select p.name as col1, p.productType.name as col2 from ProductDfn p 

một bên tham gia được sử dụng để tham gia ProductDfn để ProductType như ngủ đông tạo ra SQL rõ ràng tham gia từ ngầm tham gia trong mệnh đề select.

Tuy nhiên, khi thực hiện ở trên khi productType là null (trong DB), không có hàng nào được trả về do tham gia bên trong. Đối với mối quan hệ này tôi muốn có mặc định ngủ đông để làm một tham gia bên ngoài (vì mối quan hệ là tùy chọn) vì vậy tôi sẽ nhận được một "null" trở lại cho col2 hơn là không có hàng nào cả.

Có ai biết nếu điều này là có thể không?

Cảm ơn.

Trả lời

9

Kết nối bên trong được sử dụng vì bạn đã liệt kê rõ ràng p.productType.name trong điều khoản bạn chọn. Điều này sẽ không xảy ra là bạn chỉ cần chọn ProductDfn vì tìm nạp của bạn được đặt thành LAZY.

Nếu bạn chỉ cần lấy những hai thuộc tính bạn sẽ phải xác định rõ ràng một bên ngoài tham gia vào truy vấn của bạn:

select p.name as col1, ptype.name as col2 
    from ProductDfn p 
    left join fetch p.productType ptype 
+1

Cảm ơn, tôi đang tìm kiếm một cách để có chế độ ngủ đông thay đổi đó là mặc định tham gia kiểu cho tham gia ngầm định được thực hiện trong mệnh đề select. Lý do là chúng tôi có một ứng dụng mà nhiều truy vấn được tạo tự động/bán do truy xuất dữ liệu dạng bảng. Vì vậy, chúng ta có thể làm đối tượng cơ sở = ProductDfn và col1 là tên, col2 là productType.name, vv Thông thường điều này hoạt động tốt, chỉ cần cho các phím nước ngoài nullable nó không hoạt động khá theo cách tôi muốn. –

+2

Không có "loại tham gia mặc định", mặc dù - tham gia ngầm định sẽ _always_ là bên trong. Nếu các truy vấn của bạn đang được tạo ra, hãy xem xét sử dụng tiêu chí thay vì HQL - về cơ bản buộc sử dụng để mô tả liên kết một cách rõ ràng (thông qua bí danh/tiêu chí lồng nhau) và bạn luôn có thể chỉ định nó là tham gia bên ngoài. – ChssPly76

Các vấn đề liên quan