Toplink错误。结果为空的有效sql的空结果

时间:2011-04-15 09:05:59

标签: java toplink toplink-essentials ejbql

怎么可能?

我们在Toplink上执行EJBQL(DB是Oracle),query.getResultList为空。

但是! 当我将日志级别切换到FINE并收到Sql查询时,TopLink生成,我试图在数据库上执行此查询并且(奇迹!)我得到了非空结果!

可能是什么原因以及如何对待? 提前谢谢!

P.S。没有例外。

更新

查询日志:

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

此查询返回100k行,但toplink认为它不是......

6 个答案:

答案 0 :(得分:1)

使用FINE的日志级别可以验证您是否连接到同一个数据库?你的测试用例有多简单;你可以验证是否正在将这个精确的JPQL转换为该SQL?

答案 1 :(得分:1)

VPD(http://download.oracle.com/docs/cd/B28359_01/network.111/b28531/vpd.htm)?政策? 架构上是否定义了这种风格?这些功能透明地将动态where子句添加到数据库会话中执行的语句,因此查询结果取决于此情况下会话的状态。

答案 2 :(得分: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”,似乎不一致。

答案 3 :(得分:0)

交易? Oracle永远不会给你一个“脏读”数据库代表访问未提交数据。如果您在一个连接上发送数据,则在提交之前无法在任何其他连接上访问它。如果您稍后手动尝试查询,则已提交数据并获得预期结果。

如果要更新多个连接中的数据,并且数据操作未设置为“自动提交”,则会出现这种情况。 JPA默认为自动提交,但在事务边界处刷新可以为您提供更清晰的设计。

答案 4 :(得分:0)

我无法确切地说出来,但我对引用字符串参数感到有些惊讶。是否有可能以交互方式进行一些自动转换,但是通过此连接而不是字符串'R',它被转换为用于R的INT ascii?

答案 5 :(得分:0)

我找到了原因! 原因是甲骨文!我在Postgres上尝试了相同的代码并且它有效!

我不知道为什么,但在某些神奇的情况下,oracle忽略查询参数并且查询返回空结果。