【问题标题】:JQPL: Create new Object within the Query from multiple tablesJPQL:从多个表的查询中创建新对象
【发布时间】:2011-12-04 08:48:18
【问题描述】:

我目前正在尝试使用 JQPL 获取数据。我的查询看起来像

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN(t2 IS NOT NULL) THEN true ELSE false END) FROM table1 t1, table2 t2 WHERE t1.id = :id1 AND t2.id = :id2

当然,这两个实体本身存在,对其中一个的查询正在工作。使用固定值查询也可以:

SELECT NEW com.test.CustomObject(t1.name, false) FROM table1 t1 WHERE t1.id = :id1

我的问题是,如果 :id2 具有不存在的值,我不会收到返回值。行本身被完全省略,而不是为 CustomObject 构造函数提供 false。

如果参数 id2 在 table2 中有一行以将其作为布尔值传递给自定义构造函数,我还能做些什么来获取知识?

当然可以提供更多信息。

【问题讨论】:

  • 你的代码没有多大意义。请仔细阅读en.wikipedia.org/wiki/Join_%28SQL%29 以了解适合您的情况。
  • 我试图将我的问题简化为问题的核心,并去掉了许多额外的代码,否则这些代码会使整个查询变得不可读。我并没有真正检查逻辑。

标签: java database jpa jpql


【解决方案1】:

您必须使用 LEFT (OUTER) JOIN 从 table1 连接到 table2。当连接的右侧不存在时,这也会导致左侧成为结果的一部分。在这种情况下,来自右侧的值(例如 t2.id)具有空值。

另外,将 id 设置为参数两次也没有意义(假设您想要的是 t1.id=t2.id)。只需使用 join 并设置一次 id 参数。

【讨论】:

  • 感谢您的回复。问题是,这 id1 不是 id2 所以把 t1.id = t2.id 不会做的伎俩。 Left Outer Join 语句的外观如何。我一直认为,我可以将之前选择的左外连接部分像 SELECT ... FROM table1 t1 LEFT OUTER JOIN t1.value value;我需要的是 SELECT ... FROM table1 t1 LEFT OUTER JOIN table2 t2 - 这可能吗?我会在 where 子句中指定连接条件,例如 WHERE t2.id = :id2?
【解决方案2】:

我可以用 Exsists 解决问题:

SELECT NEW com.test.CustomObject(t1.name, CASE WHEN EXISTS(SELECT t2.id FROM table2 t2 WHERE t2.id = :id2) THEN true ELSE false END) FROM table1 t1 WHERE t1.id = :id1

【讨论】:

  • 为了进一步挖掘问题,我决定使用原生查询。有兴趣的可以留言
猜你喜欢
  • 2020-07-03
  • 1970-01-01
  • 2020-03-26
  • 2013-09-06
  • 1970-01-01
  • 2019-09-16
  • 2018-07-06
  • 1970-01-01
  • 2013-06-11
相关资源
最近更新 更多