4

我找不到使用多个这样的 where 子句是否有效(我使用 JPA、MySQL)我需要多个 where 子句,其中一个在这里将是“not”,或者我错过了什么?

select d from T_DEBIT d where d.status=PENDING and 
where not exists (
select r
from T_REQUEST r
where 
r.debit.id = d.id and
r.status = SUCCESSFUL
)

请询问您是否需要更多信息,

4

5 回答 5

4

JPA 提供对子查询的支持。 见规格

子查询可以用在 WHERE 或 HAVING 子句中。子查询的语法如下:

subquery ::= simple_select_clause subquery_from_clause [where_clause
[groupby_clause] [having_clause] 

在此版本中,子查询仅限于 WHERE 和 HAVING 子句。FROM 子句中对子查询的支持将在以后的规范版本中考虑。

您的查询似乎是用 SQL 编写的,将其转换为 JPQL 需要做一些事情:

  1. 使用实体名称而不是表名称。
  2. 如果status是类型字段,String请务必将状态括起来,例如PENDING用单引号引起来。
  3. 遵循存在表达式的语法

我相信您也可以将查询编写为联接(伪代码):

select d 
from T_DEBIT d 
left join T_REQUEST tr
on d.id = tr.debit_id
where d.status = 'PENDING'
and tr.status = 'SUCCESSFUL`
and tr.debit_id is null
于 2013-05-29T09:24:31.420 回答
4

这是无效的 sql:

select d from T_DEBIT d 
where d.status=PENDING 
and where not exists (subquery)

问题是 where 单词在主查询中出现了两次。只需将其删除,您的查询就变为:

select d from T_DEBIT d 
where d.status=PENDING 
and not exists (subquery)

其他答案也提出了有效的观点。

于 2013-05-29T09:57:49.523 回答
1

中的多个约束WHERE很好,子查询也是如此,但是如果使用文字字符串,您可能希望将要比较的值r.status与用引号括起来的值进行比较。除非我们遗漏了什么。

于 2013-05-29T09:24:57.107 回答
0

这个子查询的目的到底是什么?将它简单地包含在主查询中会不会容易得多?

 select d from T_DEBIT d, T_REQUEST r where d.status='PENDING' and r.status != 'SUCCESSFUL' and r.debit.id= d.id
于 2013-05-29T09:26:08.577 回答
0

对于多个WHERE子句,使用AND like:

    SELECT column1, column2, columnN 
    FROM table_name
    WHERE [condition1] AND [condition2] AND [condition3];

有关 AND & OR 的更多信息:http ://www.tutorialspoint.com/sql/sql-and-or-clauses.htm

于 2016-07-07T17:54:30.170 回答