Tôi nghĩ rằng truy vấn của bạn có thể sai, đó có thể là nguyên nhân của sự cố.
Bạn hiện đang sử dụng:
SELECT h FROM Hospital h
INNER JOIN Medical_Service m ON h.hospital_id = m.hospital_id
WHERE h.Postcode = :postcode AND m.Medical_name = :medical
Vấn đề có thể là Medical_Service không chứa trường Hospital_id (được sử dụng trong JOIN).
Nếu bạn hài lòng khi sử dụng các truy vấn gốc, bạn có thể thực hiện điều này:
SELECT * FROM Hospital WHERE Postcode = 3000 AND Hospital_id IN
(SELECT Hospital_id FROM Hospital_Medical hm INNER JOIN Medical_Service m ON hm.Medical_id = m.Medical_id
where Medical_name = 'Emergency')
SELECT bên trong nhận tất cả Hospital_id's cho các bệnh viện cung cấp dịch vụ Cấp cứu. Lựa chọn bên ngoài sau đó sẽ chọn tất cả các bệnh viện có Hospital_id nằm trong SELECT bên trong (nghĩa là họ cung cấp dịch vụ Cấp cứu) nhưng cũng chỉ những bệnh viện có mã bưu điện là 3000.
Để sử dụng một truy vấn gốc, bạn sẽ làm như sau:
int postcode = 3000;
String service = "Emergency";
StringBuilder sb = new StringBuilder();
sb.append("SELECT * FROM Hospital WHERE Postcode = ");
sb.append(postcode);
sb.append("AND Hospital_id IN SELECT Hospital_id FROM Hospital_Medical hm INNER JOIN "
+ "Medical_Service m ON hm.Medical_id = m.Medical_id where Medical_name = '");
sb.append(service);
sb.append("')");
String queryString = sb.toString();
Query query = em.createNativeQuery(queryString);
List<Hospital> result = query.getResultList();