JPA查询在UPDATE中切换布尔值

k1e*_*ran 5 sql jpa jpql

SQL版本工作正常,我可以切换名为bar的布尔值...

mysql> update Foo set bar = ! bar WHERE id IN (1, 7, 13);
Query OK, 3 rows affected (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

有没有一个简单的JPA查询等价,我试过

final Set<Integer> ids;
final Query query = em.createQuery("UPDATE " + Foo.class.getName()
            + " a set bar= !bar"
            + " where a.id in :ids");
    query.setParameter("ids", ids);
    query.executeUpdate(); 
Run Code Online (Sandbox Code Playgroud)

上面给出了一个org.hibernate.QueryException.

在我的实体中:

@Column(columnDefinition = "INTEGER", nullable = false)
private boolean bar; 
Run Code Online (Sandbox Code Playgroud)

关于JPA语法的任何想法?

Mik*_*unu 6

这可以通过case表达式来完成:

UPDATE FOO a 
SET a.bar = 
  CASE a.bar 
    WHEN TRUE THEN FALSE
    ELSE TRUE END
WHERE a.id in :ids
Run Code Online (Sandbox Code Playgroud)

对于可空的布尔位,需要更多:

UPDATE FOO a 
SET a.bar = 
  CASE a.bar 
    WHEN TRUE THEN FALSE
    WHEN FALSE THEN TRUE
    ELSE a.bar END
WHERE a.id in :ids
Run Code Online (Sandbox Code Playgroud)