2012-03-28 66 views
14

Tôi cần phải tham gia hai thực thể JPA trên một thuộc tính khi không có mối quan hệ FK/PK nào giữa hai bảng. Tôi đang sử dụng Hibernate và có thể sử dụng HQL truy vấn như thế nàyTham gia hai bảng không liên quan bằng cách sử dụng JPA EntityManager

select foo, bar from FooEntity as foo, BarEntity as bar 
where foo.someothercol = 'foo' and foo.somecol = bar.somecol 

Tuy nhiên, tôi muốn tránh sự phụ thuộc vào Hibernate và sử dụng EntityManager để thay thế. Xin vui lòng giúp đỡ.

Trả lời

19

Truy vấn của bạn là JPQL hợp lệ và không sử dụng chức năng cụ thể của Hibernate (chỉ khoảng cách giữa thanh và từ bị thiếu). Trong JPA 2.0 đặc điểm kỹ thuật (4.4.5 tham gia) này được giải thích với những lời sau đây:

một bên tham gia có thể được ngầm định bởi việc sử dụng một sản phẩm Descartes trong mệnh đề FROM và một điều kiện tham gia trong mệnh đề WHERE . Trong trường hợp không có điều kiện kết nối, điều này sẽ giảm xuống sản phẩm cartesian.

Trường hợp sử dụng chính cho kiểu kết hợp chung này là khi điều kiện kết nối không liên quan đến mối quan hệ khóa ngoài là được ánh xạ tới mối quan hệ thực thể. Ví dụ: SELECT c TỪ khách hàng c,

Employee e ĐÂU c.hatsize = e.shoesize

khác biệt chính để truy vấn của bạn là chọn của bạn có chứa hai loại thực thể. Kết quả truy vấn là Danh sách đối tượng []. Thứ tự của các phần tử trong mảng giống như trong câu lệnh chọn . Các công trình sau đây trong trường hợp của bạn:

String query = 
    "select foo, bar from FooEntity as foo, BarEntity as bar "+ 
    "where foo.someothercol = 'foo' and foo.somecol = bar.somecol"; 
List<Object[]> results = em.createQuery(query).getResultList(); 

for (Object[] fooAndBar: results) { 
    FooEntity foo = (FooEntity) fooAndBar[0]; 
    BarEntity bar = (BarEntity) fooAndBar[1]; 
    //do something with foo and bar 
} 
+0

khoảng cách bị thiếu giữa thanh và từ bị chấm dứt! –

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