2011-04-15 121 views
2

這怎麼可能?Toplink錯誤。空結果爲非空結果的有效sql

我們在Toplink上執行EJBQL(DB是Oracle),而query.getResultList是空的。

但是! 當我切換日誌級別爲FINE並收到SQL查詢,該TopLink生成,我試圖執行這個查詢數據庫和(奇蹟!)我得到了一個非空的結果!

可能是什麼原因以及如何處理? 在此先感謝!

P.S.沒有例外。

UPDATE:

查詢日誌:

SELECT DISTINCT t0.ID, t0.REG_NUM, t0.REG_DATE, t0.OBJ_NAME, t1.CAD_NUM, t1.CAD_NUM_EGRO, t2.ID, t2.DICT_TYPE, t2.ARCHIVE_DATE, t2.IS_DEFAULT, t2.IS_ACTUAL, t2.NAME, t0.INVENTORY_NUM FROM CODE_NAME_TREE_DICTIONARY t3, DEFAULTABLE_DICTIONARY t2, IMMOVABLE_PROP t1, ABSTRACT_PROPERTY t0 WHERE ((t3.ID IN (SELECT DISTINCT t4.ID FROM CODE_NAME_TREE_DICTIONARY t5, CODE_NAME_TREE_DICTIONARY t4, type_property_parents t6 WHERE (((t5.ID = ?) AND (t4.DICT_TYPE = ?)) AND ((t6.type_property_id = t4.ID) AND (t5.ID = t6.parent_id)))) AND ((t1.ID = t0.ID) AND (t0.PROP_TYPE_DISCR = ?))) AND ((t3.ID = t0.PROP_TYPE) AND ((t2.ID (+) = t1.STATUS_ID) AND (t2.DICT_TYPE = ?)))) ORDER BY t0.REG_NUM ASC 
    bind => [4537, R, R, realty_status]|#] 

該查詢返回10萬行,但排名靠前認爲它是不...

+0

你還記錄了查詢參數嗎?任何可能以不同方式舍入的日期或浮點參數?或者可能是任何特定於區域的轉換? – 2011-04-18 19:40:10

+0

沒有區域特定。查詢參數中只有整數。查詢參數只是來自兩個表的id。我將發佈查詢。 – 2011-04-19 03:53:34

回答

0

我找到了原因! 原因是Oracle!我已經在Postgres上試過相同的代碼,並且它已經工作了!

我不知道爲什麼,但在一些魔法情況下,oracle忽略查詢參數並查詢返回空結果。

0

交易? Oracle永遠不會給你一個「髒讀」的數據庫說明訪問未提交的數據。如果您在一個連接上發送數據,則無法在任何其他連接上訪問它,直至提交。如果您稍後手動嘗試查詢,則數據已被提交,您會得到預期的結果。

如果您在多個連接中更新數據,且數據操作未設置爲「自動提交」,則可能出現此情況。 JPA默認爲自動提交,但在事務邊界刷新可以爲您提供更清晰的設計。

+0

編號結果有100000行。在閱讀時沒有修改db。 – 2011-04-15 11:53:59

1

將日誌級別設置爲FINE可以驗證您是否連接到相同的數據庫?你的測試用例多麼簡單;你可以驗證它是否正在被翻譯成該SQL的確切JPQL?

+0

這恰恰是一個基地,並有效的請求 我並不困惑,但也許這是因爲toplink的版本不是最後的 – 2011-04-15 16:03:14

1

VPD(http://download.oracle.com/docs/cd/B28359_01/network.111/b28531/vpd.htm)?政策? 在模式中定義了這種風味嗎?這些功能在數據庫會話中執行的語句中透明地添加動態子句,因此查詢結果取決於此情況下的會話狀態。

+0

謝謝你的回答,我會檢查這些問題 – 2011-04-20 03:30:25

0

我不能確切地說,但我有點驚訝,字符串參數沒有引用。是否可能交互式地有一些自動轉換,但通過這個連接而不是字符串'R'它被轉換爲R的INT ascii?

+0

它被正確地轉換,我將嘗試捕捉真正的SQL查詢 – 2011-04-21 03:09:17

1

重新格式化查詢下列條件似乎很奇怪:

AND t2.ID (+) = t1.STATUS_ID 
AND t2.DICT_TYPE = ? 

(+)表示外連接T2的(DEFAULTABLE_DICTIONARY),但這個表似乎是不可選的,因爲它必須有一個非用於第二個條件的空DICT_TYPE。

但仔細看,綁定參數似乎也斷,田野都是爲了

  • CODE_NAME_TREE_DICTIONARY.ID
  • CODE_NAME_TREE_DICTIONARY.DICT_TYPE
  • ABSTRACT_PROPERTY。PROP_TYPE_DISCR
  • DEFAULTABLE_DICTIONARY.DICT_TYPE

在給定的參數(4537,R,R,realty_status),所述第一DICT_TYPE將是 'R',而第二是字符串 「realty_status」,這似乎不一致。