在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中获得类似的行为,还是我必须对返回的对象执行检查?
编辑:添加图形并澄清问题。 (感谢詹姆斯。)
答案 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,并且连接也将过滤不存在的关系。