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

这个查询返回100k行,但是toplink认为不是...

4

6 回答 6

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”,这似乎不一致。

于 2011-04-23T22:50:58.020 回答
1

将日志级别设置为 FINE,您可以验证您正在连接到同一个数据库吗?你的测试用例有多简单;你能确认是这个确切的 JPQL 被翻译成那个 SQL 吗?

于 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 回答
0

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

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

于 2011-04-15T11:51:14.493 回答
0

I can't tell exactly, but I am a little surprised that the string parameters are not quoted. Is it possible that interactively there are some automatic conversions, but over this connection instead of the string 'R' it was converted to the INT ascii for R?

于 2011-04-21T00:19:55.903 回答
0

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

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

于 2011-04-26T09:10:23.360 回答