Penso che la tua richiesta potrebbe essere sbagliata, che potrebbe essere la causa del problema.
Stai attualmente utilizzando:
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
Il problema potrebbe essere che Medical_Service non contiene un campo Hospital_id (usato in JOIN).
Se sei felice di utilizzare le query native, puoi farlo:
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')
Il SELECT interno ottiene tutti gli Hospital_id per gli ospedali che offrono un servizio di emergenza. La selezione esterna seleziona quindi tutti gli ospedali in cui Hospital_id si trova nella SELECT interna (cioè offrono un servizio di emergenza) ma anche solo quelli con un codice postale di 3000.
Per utilizzare una query nativa dovresti fare qualcosa del genere:
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();