我在普通的SQL中有这句话,我试图在Java JPA中实现。
UPDATE table t1, table t2
SET
t1.field1 = t2.field1,
t1.field2 = t2.field2
WHERE 1 = 1
AND t1.field3 = t2.field3
AND t1.field4 = t2.field4
;
基本上是几个领域的自我加入和其他领域的更新。
@Entity
@Table(name = "table")
@XmlRootElement
public class Table implements Serializable{
private static final long serialVersionUID = 1L;
private String field1;
private String field2;
private String field3;
private String field4;
public Table(){}
// Getters and Setters
}
当我尝试在我的方法中实现时:
[...]
CriteriaBuilder builder = this.em.getCriteriaBuilder();
CriteriaUpdate<Table> cu = builder.createCriteriaUpdate(Table.class);
Root<Table> t1 = cu.from(Table.class);
Root<Table> t2 = cu.from(Table.class);
Predicate p1 = builder.equal(t1.get(Table_.field3), t2.get(Table_.field3));
Predicate p2 = builder.equal(t1.get(Table_.field4), t2.get(Table_.field4));
cu.where(builder.and(p1, p2));
cu.set(t1.get(Table_.field1), t2.get(Table_.field1));
cu.set(t1.get(Table_.field2), t2.get(Table_.field2));
Query queryUpdate = this.em.createQuery(cu);
int ret = query.executeUpdate();
[...]
但结果总是改变0行,此外还有很少的行应该被修改。
有人遇到过类似的事情。
任何想法都会非常有用。
非常感谢!