关于JPQL使用or查询的一个疑问?

我有一个Task对象里面有3个字段引用至系统的User对象,我使用如下语句查询:
select e from m_Task e where (e.executor.id= :userId) or (e.checker.id=:userId) or (e.reviewer.id=:userId)
发现没有一条记录返回(实际应该有4条记录)
而用select e from m_Task e where (e.executor.id= :userId) 查询可以返回2条(正确的)
我这是对JPQL的使用不正确吗?OR条件不是像SQL语句那样使用吗

应该正确的,跟踪一下生成的SQL语句看看。
看看生成的语句里有没有 inner join ,task 与某个表的 inner join 可能会导致查询不出数据。

网上查了一下,好像不能这样写。这样写产生的SQL是错误的,有人说是TOPLINK的BUG

应该是
e.executor,e.checker,e.reviewer 会导致产生 inner join,生成的语句中 task 表与这三个表按 userid 字段 inner join, 这时,只有task 表中的这三个字段都不为空时才能满足条件。应该是这样,方便的话贴出生成的 sql 看看。

SELECT t1.ID AS a1, t1.ACTUAL_COMPLETION_TIME AS a2, t1.ACTUAL_START_TIME AS a3, t1.BUCKET_NAME AS a4, t1.CHECK_TIME AS a5, t1.CREATE_TS AS a6, t1.CREATED_BY AS a7, t1.DESCRIPTION AS a8, t1.FILES AS a9, t1.PLANNED_COMPLETION_TIME AS a10, t1.PLANNED_START_TIME AS a11, t1.REVIEWER_TIME AS a12, t1.TITLE AS a13, t1.UPDATE_TS AS a14, t1.UPDATED_BY AS a15, t1.CHECKER_ID AS a16, t1.EXECUTOR_ID AS a17, t1.KIND_ID AS a18, t1.REVIEWER_ID AS a19, t1.STATUS_ID AS a20, t0.ID AS a21, t0.DELETE_TS AS a22, t0.DELETED_BY AS a23, t0.LOGIN AS a24, t0.NAME AS a25, t0.VERSION AS a26, t2.ID AS a27, t2.DELETE_TS AS a28, t2.DELETED_BY AS a29, t2.LOGIN AS a30, t2.NAME AS a31, t2.VERSION AS a32, t3.ID AS a33, t3.LABEL AS a34, t3.VALUE_ AS a35, t4.ID AS a36, t4.DELETE_TS AS a37, t4.DELETED_BY AS a38, t4.LOGIN AS a39, t4.NAME AS a40, t4.VERSION AS a41, t5.ID AS a42, t5.LABEL AS a43, t5.VALUE_ AS a44 FROM M_TASK t1 LEFT OUTER JOIN M_DICT_ITEM t3 ON (t3.ID = t1.KIND_ID) LEFT OUTER JOIN M_DICT_ITEM t5 ON (t5.ID = t1.STATUS_ID), SEC_USER t4, SEC_USER t2, SEC_USER t0 WHERE ((((t1.EXECUTOR_ID = ?) OR (t1.CHECKER_ID = ?)) OR (t1.REVIEWER_ID = ?)) AND ((((t0.ID = t1.CHECKER_ID) AND (t0.DELETE_TS IS NULL)) AND ((t2.ID = t1.EXECUTOR_ID) AND (t2.DELETE_TS IS NULL))) AND ((t4.ID = t1.REVIEWER_ID) AND (t4.DELETE_TS IS NULL)))) LIMIT ?, ?

是产生了内联,改成这样试试:

select e from task e
   left join   e.executor ex
   left join  e.checker  ec 
  left join e.reviewer er
where  ex.id=:userid or  ec.id=:userid  or er.id=:userid

可以了,谢谢!这是BUG还是说JPQL就要这样写?

不是 bug, 应该这样写。

1 个帖子被拆分到新主题:官方文档"创建本地管理员 " 问题