如果值不为null,JPA将执行查询的一部分

时间:2011-05-02 10:02:20

标签: jpa

在Java中,以下是一个常见的习语:

if( null != obj && obj.getSomeNumber() > 0 ) { ... }

如果 null!= obj 为真,则仅执行长度检查。 但是,在JPA NamedQuery中,这不起作用:

@NamedQuery(
name = "query"
query = "SELECT o FROM SomeObjectList o WHERE o.someObject is not null AND o.someObject.someNumber > 0")

(这是我所期望的,因为这在SQL中也不起作用。)

o.someObject是'null'或存储SomeObjects的表的外键。 (表的每一列对应于SomeObject的一个属性。)

-------------------------           ----------------------------
| Table: SomeObjectList |           |    Table: SomeObject     |
-------------------------           ----------------------------
|  id   |   someObject  |           |  id    |  number |  name |
-------------------------           ----------------------------
|   1   |        4      |           |   3    |    -4   | foo   |
-------------------------           ----------------------------
|   2   |       null    |           |   4    |     2   |  bar  |
-------------------------           ----------------------------

所以我想创建一个NamedQuery,它将从SomeObjectList返回所有没有对象的对象(someObject == null)或SomeObject.number> 0。 目前,我获取所有对象并检查自己是否设置了someObject。

但是有没有办法在JPA中获得类似的行为,还是我必须对返回的对象执行检查?

编辑:添加图形并澄清问题。 (感谢詹姆斯。)

2 个答案:

答案 0 :(得分:9)

您需要使用外部联接。

请注意您的查询错误,您希望似乎想要OR而不是AND,否则只需删除空检查。

SELECT o FROM SomeObjectList o left join o.someObject so WHERE o.someObject is null OR so.someNumber > 0

答案 1 :(得分:1)

不确定我明白了吗?

你甚至不需要“not null”,只需要长度>对于null,0不会返回true?

你的代码也错了,长度是一个功能,而不是导航。

应该是,

SELECT o FROM SomeObject o WHERE LENGTH(o.arry) > 0

或者是arry的收藏关系?在这种情况下,您需要使用SIZE,并且连接也将过滤不存在​​的关系。