【问题标题】:Is there a way to order the WHERE conditions that my JPQL query tries?有没有办法订购我的 JPQL 查询尝试的 WHERE 条件?
【发布时间】:2016-10-15 08:12:54
【问题描述】:

我有一个问题

SELECT CAST(p.propertyId AS long) FROM Property p
 WHERE p.propertyId IS NOT NULL
   AND p.propertyId NOT LIKE '%-%'
   AND p.propertyId NOT LIKE '%+%'

这很好用,因为 WHERE 条件成功地过滤掉了 propertyId 的所有非数字值。但是,如果我尝试使用强制转换 as 条件

SELECT p FROM Property p
 WHERE p.propertyId IS NOT NULL
   AND p.propertyId NOT LIKE '%-%'
   AND p.propertyId NOT LIKE '%+%'
   AND CAST(p.propertyId AS long) BETWEEN 999999 AND 10000000

它失败并出现错误java.sql.SQLException: ORA-01722: invalid number

有没有办法强制最后一个条件只检查前三个通过?

【问题讨论】:

  • 那么你得到了哪些应该显示的值,它们在演员表之前/之后是什么?
  • 在第一个查询中,我得到了回报。如果我不施放它们,它们会以字符串的形式返回。在第二个查询中,我没有得到任何东西,因为它失败了。
  • 您检查了生成的 SQL 吗?不是 JPQL 查询,而是它被翻译成的 SQL 查询导致了问题(提示:你得到一个 SQLException)。
  • 您是否尝试使用括号来定义评估顺序?
  • 它们都是 AND 条件。我会在哪里放括号来首先订购其中一些

标签: java sql hibernate jpa jpql


【解决方案1】:

如果您的第一个请求过滤掉所有可以从其结果中选择的非数值:

SELECT p FROM
(
SELECT p1 FROM Property p1
 WHERE p1.propertyId IS NOT NULL
   AND p1.propertyId NOT LIKE '%-%'
   AND p1.propertyId NOT LIKE '%+%'
)
where CAST(p.propertyId AS long) BETWEEN 999999 AND 10000000

【讨论】:

  • 您不能在 FROM 子句中执行 JPQL 子查询,但这是个好主意。我可能可以用 EXISTS 做点什么
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多