微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 表被指定两次,既作为’UPDATE’的目标,又作为单独的数据源

我使用spring-jpa和hibernate实现.我使用mariadb,我尝试做一个更新子查询

我的对象结构

@Entity
public class Room {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long roomId;

  @ManyToOne  
  @JoinColumn(name = "appartment_id")
  private Appartment appartment;
}

@Entity
public class Appartment {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long appartmentId;

  @OneToMany
  @JoinColumn(name="appartment_id")
  private Set<Room> roomList;
}

update Room r1
set r1.available = :availability
where r1.roomId in
( select r2.roomId from Room r2 JOIN r2.appartment a1 WHERE a1.appartmentId = :appartmentId )

我收到这个错误

java.sql.SQLException:表’room’被指定两次,既作为’UPDATE’的目标,又作为单独的数据源

解决方法:

这是MySQL的限制: –

http://dev.mysql.com/doc/refman/5.7/en/update.html

您无法更新表并从子查询中的同一表中进行选择.

有时你可以做一个软糖来隐藏可能有效的子查询级别的子查询.这样的事情(未经测试): –

UPDATE Room r1
SET r1.available = :availability
WHERE r1.roomId IN
    SELECT roomId
    FROM
    ( 
        SELECT r2.roomId 
        FROM Room r2 
        JOIN r2.appartment a1 
        WHERE a1.appartmentId = :appartmentId 
    )

请注意,您的查询可能有错误.在子查询中,您将表名为r2的表连接到名为r2的数据库上名为appartment的表.您的子查询也会在没有连接条件的情况下执行JOIN.

但是,您很可能只需要在UPDATE语句中进行连接而无需子查询: –

UPDATE Room 
INNER JOIN r2.appartment a1
ON Room.roomId = a1.roomId
SET r1.available = :availability
WHERE a1.appartmentId = :appartmentId 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐