当前位置: 首页 > 知识库问答 >
问题:

如何使Spring Data JPA仓库在没有结果时返回异常?

屈畅
2023-03-14

我正在将一个现有项目迁移到Spring Data JPA存储库。

在旧项目中,我的DAO如下所示:

public class MovieDAOImp implements MovieDAO {

    public Movie findByTitle(String title) throws NoResultException {
       /... query the db, if no Movie, throw new NoResultException */
    }

}

新的Spring JPA实现看起来像这样...

public interface MovieRepository extends JpaRepository<Movie, Integer> {

    Movie findByTitle(String title);

}

在新版本findBytitle将返回null,如果没有电影,但我希望它抛出一个异常(最好是我的NoResultExctive,但任何异常都可以)。

我的问题是,我所有的服务都是在预期NoResult异常发生的情况下实现的。

我不想重新使用我所有的服务来检查空值。

有没有办法让JpaRepository在没有结果时抛出异常?

共有1个答案

微生翼
2023-03-14

我找不到问题的直接答案,所以我想出了这个解决办法。。。

我继续实现自己的DAO,并在内部使用repo

这样做的好处是,我可以完全控制DAO接口,包括抛出的异常,所以我不必重新处理我的服务。

但它的缺点是增加了一个额外的层。

public class MovieDAOImp implements MovieDAO {

    @Autowired
    private MovieRepository repo;

    public Movie findByTitle(String title) throws NoResultException {
        Movie ret = repo.findByTitle(title);
        if (ret == null) {
            throw new NoResultException("Unable to find movie by title '"+title+"'.");
        }
        return ret;    
    }

}

如果有人想出了更好的方法,请发布一个答案!

 类似资料:
  • 我很好奇是否可以在以下情况下使用orElseThrow(),或者是否有更Java的8种方法可以将其等效为1行?

  • 问题内容: 当SQL查询的结果为零行>时,将返回什么?如果它返回一个对象,我们将如何检测到SQL查询未返回任何内容。 假定SQL查询为语句。 问题答案: 您是否检查了ResultSet的下一个方法。最初,ResultSet的光标指向第一行之前,对next()的第一次调用返回false表示ResultSet中没有数据。

  • 问题内容: 我在自己的类中拥有所有异步调用,因此我不想将aync’ly设置为全局变量。为此,我想从我的asunc postProcess方法返回对象,例如字符串。 能做到吗? 下面是我类的一般结构,例如,我想从onPostExecute()返回一个字符串。我看到在其他地方提到了委托,但这似乎很混乱,确定有办法为类或方法提供返回类型吗? 问题答案: 像下面这样 和听众课 你可以这样打电话

  • 问题内容: 我有这种简单的查询,它返回给定id的非空整数字段: 问题是,如果找不到ID,则结果集为空。我需要查询始终返回一个值,即使没有结果也是如此。 我有这个东西工作,但我不喜欢它,因为它运行相同子查询的2倍: 如果该行存在,则返回field1,否则返回0。有什么改进的方法吗? 谢谢! 编辑以下一些评论和答案 :是的,它必须在 单个查询语句中, 并且我不能使用count技巧,因为 我只需要返回1

  • 我一直在使用异步任务来访问web服务器,并使用结果更新控件。这有缺点,即它使异步方法特定于控件,并阻止我再次使用返回的字符串。 我的典型asyncTask代码如下

  • 我在做一个基于线性探测的自定义哈希表,在C 11中,我在其中做了一个函数,函数应该返回哈希表中对应键的值,这是我的代码: 问题是,传递的每个键在哈希表中可能没有对应的值。在这个函数中,我无法获得如何处理这个异常。处理这个异常的可能方法是什么?C STL