【问题标题】:JPA getSingleResult() did not receive any entities errorJPA getSingleResult() 没有收到任何实体错误
【发布时间】:2020-01-30 10:56:05
【问题描述】:

我正在编写更新作为 CRUD 测试的一部分,当我测试我的代码时,我收到一条错误消息,提示找不到实体。我不知道为什么,因为我的搭档做了完全相同的代码,而且他工作得很好。我们俩都无法弄清楚发生了什么。我在 getSingleResult() 方法上遇到错误。

    @Test
public void updateBookTest() {
    Book book = em.createQuery("select b from Book b where b.title = :title", Book.class).setParameter("title", "createABook").getSingleResult();

    tx.begin();
    book.setTitle("updatedThisBook");
    book.setAuthor("newAuthor");
    tx.commit();

    Book updatedBook = em.find(Book.class, book.getBookId());
    assertEquals(book.getTitle(), updatedBook.getTitle());
    assertEquals(book.getAuthor(), updatedBook.getAuthor());
    System.out.println("updateBookTest:\t" + book.toString());

    tx.begin();
    book.setTitle("createABook");
    tx.commit();        
}

这是我的代码。如果需要更多信息,请告诉我。

【问题讨论】:

  • 在 DB 中可能没有提供标题的 Book 实体的记录?您的合作伙伴是否在查询同一个数据库?据我所知,如果在 DB 中找不到符合条件的记录,getSingleResult 将失败。见stackoverflow.com/questions/2002993/jpa-getsingleresult-or-null
  • 如果找到超过 1 条记录,getSingleResult 也会失败。检查表中是否有具有相同标题的实体
  • 你们是否都从同一个数据库中获取信息?

标签: jpa


【解决方案1】:
如果没有结果,

getSingleResult 必须抛出 NoResultException

所以,你的测试没问题。

检查两者是否使用相同的数据库(并且没有返回数据),两者都运行相同的查询,并且都使用相同的 jpa 实现版本。

来自 javadoc(自 jpa 1.0 起):

getSingleResult

java.lang.Object getSingleResult():执行返回单个无类型结果的 SELECT 查询。

返回:结果

投掷:

  • NoResultException - 如果没有结果

  • NonUniqueResultException - 如果有多个结果

  • IllegalStateException - 如果调用 Java Persistence 查询语言 UPDATE 或 DELETE 语句

  • QueryTimeoutException - 如果查询执行超过设置的查询超时值并且只有语句回滚

  • TransactionRequiredException - 如果已设置锁定模式且没有事务

  • PessimisticLockException - 如果悲观锁定失败并且事务回滚

  • LockTimeoutException - 如果悲观锁定失败并且只有语句回滚

  • PersistenceException - 如果查询执行超过设置的查询超时值并且事务回滚

参考javadoc getSingleResult

另外一点,检查你的朋友没有调用 getResultList 而不是 getSingleResult。该方法返回一个列表,如果为空则不抛出异常。

参考javadoc getResultList

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2021-10-06
    • 2011-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多