【问题标题】:JPA, Can not delete recordJPA,无法删除记录
【发布时间】:2013-07-11 14:52:03
【问题描述】:

我正在尝试使用 JPA 删除多行(如果有),我得到 nullpointer 异常。参数和实体管理器 not 为空。有什么想法可能导致此异常吗?

P.S 类被注解@Transactional

@Override
public void removeAccount(String id) {
    try {

        int deleteRecords = entityManager.createQuery("DELETE from bankaccount b where b.accountNumber = ?1", BankAccount.class)
                .setParameter(1, accountNumber)
                .executeUpdate();

    } catch (Exception ex) {
        ex.getMessage();
    }
}

【问题讨论】:

  • ex.getMessage(); 是干什么用的?你可以发布堆栈跟踪吗?
  • 使用删除方法而不是查询,描述 [这里][1]。 [1]:*.com/a/11539796/529543
  • entityManager.createQuery?
  • @matheszabi 实体管理器查找方法只能使用主键查找,我只有要查找的帐户 ID?
  • @nachokk 是 entityManager.createQuery 给出空指针异常,为什么?

标签: java sql hibernate jpa


【解决方案1】:

您不必输入第二个参数,我也将类名放入查询中。 BankAccountString id 从未在该方法中使用。

int deleteRecords = entityManager.createQuery("DELETE from BankAccount b where b.accountNumber = ?1")
                .setParameter(1, accountNumber)
                .executeUpdate();

【讨论】:

    【解决方案2】:

    要删除一个实体,你应该先查询它,然后将它传递给 remove 方法。

    例如,如果accountNumberBankAccounts 主键:

    BankAccount account = entityManager.find(BankAccount.class, accountNumber);
    entityManager.remove(account);
    

    更新

    如果您不能使用primary key 并且需要删除多个条目,您可以使用您提供的代码,但不要进行键入查询:

    int numberOfRecords = entityManager
        .createQuery("DELETE from bankaccount b where b.accountNumber = ?1")
        .setParameter(1, accountNumber)
        .executeUpdate();
    

    【讨论】:

    • accountNumber 不是这里的主键,我会删除多条记录,这就是为什么我更喜欢使用简单的删除查询请改进或删除这个答案。
    • 它应该是 createNativeQuery,而不是 createQuery。 .createNativeQuery("DELETE b from bankaccount b where b.accountNumber = ?1")