spring-data-jpa 如何在返回值不为1的JPA自定义查询中返回有用的信息?

yruzcnhs  于 2022-11-10  发布在  Spring
关注(0)|答案(2)|浏览(141)

我在一个扩展JpaRepository的接口中有几个自定义查询。下面只是举例说明,可能会有错误,但不要担心)。

public interface MyRepo extends JpaRepository<SMark, String> {

@Transactional
@Modifying
@Query(value = "INSERT INTO my_table(id, col_1, col_2) " +
        "values(:col_1, :col_2))", nativeQuery = true)
int insertRecord(@Param("col_1") String col_1, @Param("col_2") String col_2);

因此,我的问题是,除了成功的查询之外,我发现很难对int返回类型做任何有用的事情(它将返回1)。除了将值作为响应的一部分发送之外,是否还有其他方法可以对返回值执行任何有用的操作?换句话说,如果响应不是1,并且没有抛出异常,非1响应是否可以被转换为对用户来说信息更丰富的内容?
例如,我目前正在做以下工作,如果我对非1状态有信心,我希望改进这些工作:

if(status == 1) {
        StatusResponse statusResponse = new StatusResponse("Successful Delete ", null);
        return new ResponseEntity<>(statusResponse, HttpStatus.OK);
    }
    else {
        StatusResponse statusResponse = new StatusResponse("Delete not successful (lacking details from response)  ", null);
        return new ResponseEntity<>(statusResponse, HttpStatus.NOT_ACCEPTABLE);
    }

感谢任何回应。谢谢!

7fhtutme

7fhtutme1#

我不推荐使用返回类型作为有效操作的方法。我更喜欢有数据库级的约束,如唯一约束,检查约束或触发器检查插入/更新/删除。
不过,我们可以在接口内部使用默认方法并抛出数据库异常,在Spring中,您可以配置ExceptionHandler来 Package 异常并返回一些有效的错误代码。

public interface MyRepo extends JpaRepository<SMark, String> {

    @Transactional
    @Modifying
    @Query(value = "INSERT INTO my_table(id, col_1, col_2) " +
            "values(:col_1, :col_2))", nativeQuery = true)
    int insertRecord(@Param("col_1") String col_1, @Param("col_2") String col_2);

    default void insert(String col1, String col2) {
        if (insertRecord(col1, col2) != 1) {
            throw new DataIntegrityViolationException("Unable to perform DML operation.");
        }
    }
}
t1rydlwq

t1rydlwq2#

由于这个方法的返回值表示修改对象的数量(在你的代码中,它只能是0或1),我将使用它来将它转换为更容易理解的响应。
最简单的情况是REST Api:
当方法返回1时,POST/PUT/PATCH调用成功(如果没有其他错误),您将返回201 Created,可能更像一个Location标头。
当它返回0时,意味着没有对象被修改,因为它是一个插入,所以不应该发生这种情况,因此您将返回500 InternalServerError
但我认为在您的情况下这是多余的,因为正如我所说的,这是一个插入,您只有这两个返回选项,我猜如果在插入过程中出现问题,您已经在 Spring Boot 时得到了一个异常,因此,当您调用该方法而没有得到错误时,我会说它成功了。
当然,您可以仔细检查以确保正确,甚至可以将其用于测试以强制执行预期的行为或其他操作。

相关问题