2011-10-10 180 views
1

我目前正試圖用JQPL獲取數據。我的查詢看起來像JQPL:在多個表的查詢中創建新的對象

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN(t2 IS NOT NULL) THEN true ELSE false END) FROM table1 t1, table2 t2 WHERE t1.id = :id1 AND t2.id = :id2 

當然,兩個實體iteself存在查詢其中一個正在工作。與固定值查詢也可以工作:

SELECT NEW com.test.CustomObject(t1.name, false) FROM table1 t1 WHERE t1.id = :id1 

我的問題是,我沒有收到返回值是否爲ID2有一個不存在的價值。而不是給CustomObject構造函數賦予錯誤,該行本身被完全省略。

如果參數id2在table2中有一行將此值作爲布爾值傳遞給自定義構造函數,還能做些什麼來獲得知識?

當然可以提供進一步的信息。

+0

您的代碼不會有很大的意義。請仔細閱讀http://en.wikipedia.org/wiki/Join_%28SQL%29以瞭解適合您情況的內容。 – kan

+0

我試圖簡化我的問題到問題的核心,並擺脫了很多額外的代碼,否則會使整個查詢無法讀取。我沒有真正檢查邏輯。 – Johnnycube

回答

0

我能解決Exsists問題:

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN EXISTS(SELECT t2.id FROM table2 t2 WHERE t2.id = :id2) THEN true ELSE false END) FROM table1 t1 WHERE t1.id = :id1 
+0

進一步挖掘問題,我決定去原生查詢。如果有人感興趣,留言 – Johnnycube

2

您必須使用LEFT(OUTER)JOIN從table1連接到table2。這也會導致左手邊也成爲結合的右手邊不存在時的一部分。在這種情況下,來自右側的值(例如t2.id)具有空值。

另外,將id設置爲參數兩次沒有任何意義(假設你想要的是t1.id = t2.id)。只需使用join和set id參數一次。

+0

感謝您的回覆。問題是,id1不是id2,所以把t1.id = t2.id也不行。左外部聯接語句如何看起來像。我一直認爲,我可以左外部連接以前選擇的部分,如SELECT ... FROM table1 t1 LEFT OUTER JOIN t1.value value;我需要的東西就像SELECT ... FROM table1 t1 LEFT OUTER JOIN table2 t2 - 這可能嗎?我會在where子句中指定連接條件,如WHERE t2.id =:id2? – Johnnycube