2011-10-10 24 views
1

我目前正试图用JQPL获取数据。我的查询看起来像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 

当然,两个实体iteself存在查询其中一个正在工作。与固定值查询也可以工作:

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

我的问题是,我没有收到返回值是否为ID2有一个不存在的价值。而不是给CustomObject构造函数赋予错误,该行本身被完全省略。

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

当然可以提供进一步的信息。

+0

您的代码不会有很大的意义。请仔细阅读http://en.wikipedia.org/wiki/Join_%28SQL%29以了解适合您情况的内容。 – kan

+0

我试图简化我的问题到问题的核心,并摆脱了很多额外的代码,否则会使整个查询无法读取。我没有真正检查逻辑。 – Johnnycube

回答

0

我能解决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 
+0

进一步挖掘问题,我决定去原生查询。如果有人感兴趣,留言 – Johnnycube

2

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

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

+0

感谢您的回复。问题是,id1不是id2,所以把t1.id = t2.id也不行。左外部联接语句如何看起来像。我一直认为,我可以左外部连接以前选择的部分,如SELECT ... FROM table1 t1 LEFT OUTER JOIN t1.value value;我需要的东西就像SELECT ... FROM table1 t1 LEFT OUTER JOIN table2 t2 - 这可能吗?我会在where子句中指定连接条件,如WHERE t2.id =:id2? – Johnnycube