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

Java Toplink错误。结果不为空的有效sql的空结果,java,toplink,toplink-essentials,ejbql,Java,Toplink,Toplink Essentials,Ejbql,怎么可能呢 我们正在Toplink上执行EJBQL(DB是Oracle)并且query.getResultList为空 但是 当我将日志级别切换到FINE并收到TopLink生成的Sql查询时,我尝试在数据库上执行此查询,结果(奇迹!)非空 原因可能是什么?如何治疗? 提前谢谢 请注意,没有例外 更新: 查询日志: SELECT DISTINCT t0.ID, t0.REG_NUM, t0.REG_DATE, t0.OBJ_NAME, t1.CAD_NUM, t1.CAD_NUM_EGRO, t

怎么可能呢

我们正在Toplink上执行EJBQL(DB是Oracle)并且
query.getResultList
为空

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

原因可能是什么?如何治疗? 提前谢谢

请注意,没有例外

更新:

查询日志:

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万行,但toplink认为它不是…

事务?Oracle从来不会给您一个“脏读”,即数据库用来访问未提交的数据。如果在一个连接上发送数据,则在提交数据之前,无法在任何其他连接上访问该数据。如果稍后手动尝试查询,则数据已提交,您将获得预期结果


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

在日志级别为精细的情况下,您可以验证您是否连接到同一个数据库吗?您的测试用例有多简单;您能否验证正是这个JPQL被转换为那个SQL?

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

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

重新格式化查询时,以下条件似乎很奇怪:

AND t2.ID (+) = t1.STATUS_ID
AND t2.DICT_TYPE = ?
(+)
表示t2(可默认的字典)的外部联接,但该表似乎是非可选的,因为第二个条件必须具有非空的DICT类型

仔细观察,绑定参数似乎也处于关闭状态,字段是有序的

  • 代码\名称\树\字典.ID
  • 代码\u名称\u树\u字典.DICT\u类型
  • 抽象\u属性.PROP\u类型\u DISCR
  • 可默认的字典.DICT类型
对于给定的参数(4537,R,R,realty_status),第一个DICT_类型是'R',而第二个是字符串“realty_status”,似乎不一致。

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


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

否。结果有100000行。在阅读过程中没有对db进行任何修改。这正是一个基础,我并不感到困惑,这是一个有效的请求,但可能是因为toplink的版本不是最新的。您是否也记录了查询参数?是否有可能以不同方式舍入的日期或浮动参数?或者任何特定于语言环境的转换?没有特定于语言环境的转换。仅查询参数中的整数。查询参数仅为来自两个表的ID。我将发布查询。它已正确转换,我将尝试捕获真正的sql查询