我一直在编写一个定制的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);
我已经尝试了这两种方法,但只是想了解这是否是引入可选的原始用例之一。
2条答案
按热度按时间wydwbb8l1#
Optional
是一个核心Java类,因此引入它并不是为了与Spring或JPA有任何关系,但对您的问题的实际答案是“是的”。Spring/Hibernate/JPA在第一个示例这样的情况下支持它。(如orElse()
),也可以作为一种契约形式,明确表示返回值可以为空,返回Optinal
可以让调用者清楚地知道结果可能为空/缺失/不存在--换句话说,就是null
。话虽如此,返回
Optional<List<>>
(如示例2中所示)没有意义;一个返回对象集合的查询方法将返回一个 empty 集合,而不是null
,所以在这种情况下不需要使用Optional
。s5a0g9ez2#
不需要将
Optional
与List<T>
一起使用,因为如果找不到任何内容,Spring Data将返回一个空列表(大小为零)。然而,如果你返回一个对象,就可能没有匹配,然后你会得到
null
而不是object。而且你可能会得到NullPointerException
试图调用它的方法。这取决于你是否使用Optional
和单个对象。因为可能会有一些情况取决于你的业务,例如,如果你完全确信你想要的对象会被找到(例如,一些常量),那么你就可以不使用Optional
,但是如果有可能找不到那个对象,一定要使用Optional
并检查你的实际对象是否存在。这是典型的方法。