【问题标题】:JPA update Query issueJPA 更新查询问题
【发布时间】:2014-08-16 20:55:39
【问题描述】:

假设我们有 2 个实体

@Entity(name = "user")
@Inheritance(strategy = InheritanceType.JOINED)
public class User{

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

 private String name;
}

另一个继承的类

@Entity
public class ExtendedUser extends User{
   private String bio;
}

现在当我尝试运行 JPA 更新查询时

@Modifying
@Query("update ExtendedUser  set bio=?2 where id=?1")
void updateOverflowText(Long id,String bio);

我遇到异常,无法运行查询,因为“id”列不明确

Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'id' in where clause is ambiguous
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
 at java.lang.reflect.Constructor.newInstance(Unknown Source)
 at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
 at com.mysql.jdbc.Util.getInstance(Util.java:386)
 at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1040)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4074)
 at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
 at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
 at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
 at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)
 at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)
 at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)
 at org.hibernate.hql.ast.exec.MultiTableUpdateExecutor.execute(MultiTableUpdateExecutor.java:142)
 ... 103 more

【问题讨论】:

  • 试试update ExtendedUser usr set usr.bio=?2 where usr.id=?1
  • 试过了。但它没有工作
  • 如果您在后端执行相同的更新语句并使用值查看它是否正常工作。
  • 这个answer 可以帮助你。

标签: java jpa


【解决方案1】:

试试这个

更新用户 usr 设置 usr.bio=?2 where usr.id=?1

【讨论】:

    【解决方案2】:

    试试这个:

    @Modifying 
    @Query( nativeQuery = true, value = "update user set bio=?2 where id=?1")
    int updateOverflowText( Long id, String bio );    `
    

    【讨论】:

    • 我不知道,不知何故,以“尝试”开头的答案让我感觉作者不确定提议的更改会产生什么效果。无论如何,如果您添加解释为什么您的解决方案将解决问题,我会更有信心。 - 话虽如此,欢迎堆栈溢出并感谢您分享您的知识:)
    • 介意explain your solution吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多