java 使用自定义Spring存储库的可选返回类型

dm7nw8vv  于 2023-01-15  发布在  Java
关注(0)|答案(2)|浏览(167)

我一直在编写一个定制的JPA查询来处理可能返回结果也可能不返回结果的复杂查询。

    • 注意**:我将使用一个简单查询作为此问题的示例。

例一:

@Query(value = "SELECT TOP(1) e FROM Employee e WHERE e.NAME = :name", nativeQuery = true)
Employee getEmployeeByName(@Param("name") String employeeName);

例二:

@Query(value = "SELECT s FROM Student s WHERE s.CLASS = :class", nativeQuery = true)
List<Student> getStudentsByClass(@Param("class") String className);

在这两个例子中,建议使用Optional作为返回类型(如下所示),因为可能会出现我们没有得到Employee或Student的情况?

@Query(value = "SELECT TOP(1) e FROM Employee e WHERE e.NAME = :name", nativeQuery = true)
Optional<Employee> getEmployeeByName(@Param("name") String employeeName);

@Query(value = "SELECT s FROM Student s WHERE s.CLASS = :class", nativeQuery = true)
Optional<List<Student>> getStudentsByClass(@Param("class") String className);

我已经尝试了这两种方法,但只是想了解这是否是引入可选的原始用例之一。

wydwbb8l

wydwbb8l1#

Optional是一个核心Java类,因此引入它并不是为了与Spring或JPA有任何关系,但对您的问题的实际答案是“是的”。Spring/Hibernate/JPA在第一个示例这样的情况下支持它。(如orElse()),也可以作为一种契约形式,明确表示返回值可以为空,返回Optinal可以让调用者清楚地知道结果可能为空/缺失/不存在--换句话说,就是null
话虽如此,返回Optional<List<>>(如示例2中所示)没有意义;一个返回对象集合的查询方法将返回一个 empty 集合,而不是null,所以在这种情况下不需要使用Optional

s5a0g9ez

s5a0g9ez2#

不需要将OptionalList<T>一起使用,因为如果找不到任何内容,Spring Data将返回一个空列表(大小为零)。
然而,如果你返回一个对象,就可能没有匹配,然后你会得到null而不是object。而且你可能会得到NullPointerException试图调用它的方法。这取决于你是否使用Optional和单个对象。因为可能会有一些情况取决于你的业务,例如,如果你完全确信你想要的对象会被找到(例如,一些常量),那么你就可以不使用Optional,但是如果有可能找不到那个对象,一定要使用Optional并检查你的实际对象是否存在。
这是典型的方法。

相关问题