更好的是:getSingleResult或getResultList JPA

And*_*rey 11 jpa

我需要从表中检索单行,我感兴趣的是哪种方法更好.一方面getSingleResult是为了检索单个结果而设计的,但它会引发异常.请问这种方法在性能与效益getResultList

query.setFirstResult(0);
query.setMaxResults(1); 
Run Code Online (Sandbox Code Playgroud)

Tom*_*asz 19

Joshua Bloch的Effective Java表示:

对于可以合理预期可以恢复调用者的条件,使用已检查的异常.使用运行时异常来指示编程错误.

感谢来源:为什么你不应该在JPA中使用getSingleResult()

@Entity
@NamedQuery(name = "Country.findByName", 
            query = "SELECT c FROM Country c WHERE c.name = :name"
public class Country {
  @PersistenceContext
  transient EntityManager entityManager;

  public static Country findByName(String name) {
      List<Country> results = entityManager
            .createNamedQuery("Country.findByName", Country.class)
            .setParameter("name", name).getResultList();
      return results.isEmpty() ? null : results.get(0);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • Java 中很少有绝对值,本文所宣扬的绝对值并不适用于所有用例。例如,如果查询应始终返回一行以满足某些业务要求,为什么要花费周期来编组结果列表以检查计数以查看业务条件是否违反,当您可以调用 getSingleResult 并捕获 NoResultException/NoUniqueResultException 异常和采取适当的行动?它的代码较少,并且使用异常来强制执行异常业务逻辑条件。 (2认同)

勿绮语*_*勿绮语 10

getSingleResult抛出NonUniqueResultException,如果有多行.它设计用于在真正有单个结果时检索单个结果.

你的方式很好,JPA旨在正确处理这个问题.同时,你无法将它与getSingleResult任何方式进行比较,因为它不起作用.

但是,依赖于您正在处理的代码,最好优化查询以返回单个结果,如果这就是您想要的 - 那么您可以调用getSingleResult.