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

Arv*_*dan 6 jpa

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

if( null != obj && obj.getSomeNumber() > 0 ) { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

(这是我所期望的,因为这在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  |
-------------------------           ----------------------------
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jam*_*mes 9

您需要使用外部联接.

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

SELECT o FROM SomeObjectList o left join o.someObject so WHERE o.someObject is null OR so.someNumber > 0
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,看来可以了。但是“不为空AND”不应该与“为空或”相同吗? (2认同)