1

どうしてそれは可能ですか?

Toplink(DBはOracle)でEJBQLを実行しており、query.getResultList空です。

だが! ログレベルを切り替えFINEて、TopLinkが生成するSQLクエリを受け取ったとき、データベースでこのクエリを実行しようとしましたが、(奇跡!)空ではない結果が得られました!

その理由は何で、どのように扱われますか?前もって感謝します!

PS例外はありません。

アップデート:

クエリログ:

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]|#]

このクエリは100,000行を返しますが、toplinkはそうではないと信じています...

4

6 に答える 6

1

ログレベルがFINEの場合、同じデータベースに接続していることを確認できますか?テストケースはどれほどシンプルですか。そのSQLに変換されているのはこの正確なJPQLであることを確認できますか?

于 2011-04-15T13:03:58.603 に答える
1

VPD(http://download.oracle.com/docs/cd/B28359_01/network.111/b28531/vpd.htm)?ポリシー?このフレーバーの何かがスキーマで定義されていますか?これらの機能は、データベースセッションで実行されるステートメントに動的なwhere句を透過的に追加するため、この場合、クエリ結果はセッションの状態に依存します。

于 2011-04-19T12:41:30.570 に答える
1

クエリを再フォーマットすると、次の条件が奇妙に見えました。

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

はt2(DEFAULTABLE_DICTIONARY)の(+)外部結合を示しますが、このテーブルは2番目の条件に対してnull以外の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'になり、2番目のパラメーターは一貫性がないように見える文字列"realty_status"になります。

于 2011-04-23T22:50:58.020 に答える
0

理由がわかりました!その理由はOracleです!私はPostgresで同じコードを試しましたが、うまくいきました!

理由はわかりませんが、魔法の場合、オラクルはクエリパラメータを無視し、クエリは空の結果を返します。

于 2011-04-26T09:10:23.360 に答える
0

トランザクション?Oracleは、コミットされていないデータへのアクセスについてデータベースが話す「ダーティリード」を提供することはありません。1つの接続でデータを送信すると、コミットされるまで他の接続でデータにアクセスできなくなります。後で手動でクエリを試行すると、データがコミットされ、期待どおりの結果が得られます。

この状況は、複数の接続でデータを更新していて、データ操作が「自動コミット」に設定されていない場合に発生する可能性があります。JPAのデフォルトは自動コミットですが、トランザクション境界でのフラッシュにより、よりクリーンな設計が可能になります。

于 2011-04-15T11:51:14.493 に答える
0

正確にはわかりませんが、文字列パラメータが引用符で囲まれていないことに少し驚いています。インタラクティブにいくつかの自動変換がある可能性はありますが、この接続を介して、文字列'R'の代わりにRのINTASCIIに変換されましたか?

于 2011-04-21T00:19:55.903 に答える