2011-04-26 31 views
2

我正在使用以下查詢獲取與用戶鏈接的所有水果。JPQL:使用繼承的以下WHERE子句的問題

return (List<Fruit>) getEm() 
      .createQuery(
        "SELECT DISTINCT f FROM Fruit f, User u WHERE (f = u.apples OR f = u.oranges OR f = u.mangos) AND u.id = :id") 
      .setParameter("id", id).getResultList(); 

相應實體如下:

public class Fruit{ 

private int id; 

}

public class User{ 

private int id; 
private Collection<Apple> apples; 
private Collection<Orange> oranges; 
private Collection<Mango> mangos; 

}

public class Mango extends Fruit{ 

private int id; 
... 

}

public class Apple extends Fruit{ 

private int id; 
... 

}

public class Orange extends Fruit{ 

private int id; 
... 

}

的問題是,上述查詢不給我一個結果,如果有收藏的不存在的用戶。所以,如果用戶沒有蘋果,我不會得到0作爲結果。我已經嘗試用u.apples IS NOT EMPTY等語句來捕捉錯誤,但它也可以解決問題。

那麼,你能否給我一個這種情況下的提示?整個事情會更容易,如果水果將與用戶有一對多的關係,但不幸的是我不能承受這個程序...

在此先感謝!

回答

0

懷疑你想要IN而不是=,但像「無法承擔這個程序」這樣的短語讓我緊張,有很多被黑客入侵的東西正在進行。

1

您的JPQL無效,所以我不確定它是如何工作的。

您只能使用「。」 ToOne上的符號而不是ToMany,對於ToMany,您需要使用連接。對於聯接,您可以使用外部聯接來允許任何聯接。

SELECT DISTINCT f FROM Fruit f, User u left join u.apples a ... WHERE f = a or ...