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

是否可以在Spring Data JPA存储库的@Query注释中使用Oracle匿名块?

章永安
2023-03-14

我有一个Emp表和关联的JPA实体-雇员。Emp表具有id、name和is_active列。还有一个资产表,它有对Emp表的FK引用。Assets表有id、emp_id和NAME。

public interface EmployeeRepository implements JpaRepository<Employee, Long>{
    @Query(
       nativeQuery = true,
       value="BEGIN"+
             "   delete from assets where emp_id = :employeeId;"+
             "   update emp set is_active= 'N' where id = :employeeId;" +
             "END" 
    )
    public void inactivate(@Param("employeeId") Long employeeId);
}

附注:我知道还有其他方法,比如Hibernates的级联特性等,但我特别感兴趣的是Oracle匿名块的使用。

共有1个答案

都浩淼
2023-03-14

在spring boot starter data jpa 1.2.5(hibernate 4.3.10)、oracle 12c上测试。

不工作:

@Modifying
@Query(value = "begin insert into T (ID,A) values (:id, :a); exception when dup_val_on_index then update T set A = :a where ID = :id; end;", nativeQuery = true)
void upsertWatchdog(@Param("id") Long id, @Param("a") Date a);

或:

@Modifying
@Query(value = "begin insert into T (ID,A) values (?1, ?2); exception when dup_val_on_index then update T set A = ?2 where ID = ?1; end;", nativeQuery = true)
void upsertWatchdog(Long id, Date a);
@Modifying
@Query(value = "begin insert into T (ID,A) values (?1, ?2); exception when dup_val_on_index then update T set A = ?2 where ID = ?1 ; end;", nativeQuery = true)
void upsertWatchdog(Long id, Date a);
@Modifying
@Query(value = "begin insert into T (ID,A) values (:id, :a); exception when dup_val_on_index then update T set A = :a where ID = :id ; end;", nativeQuery = true)
void upsertWatchdog(@Param("id") Long id, @Param("a") Date a);
@Modifying
@Query(value = "begin insert into T (ID,A) values (?, ?); exception when dup_val_on_index then update T set A = ? where ID = ?; end;", nativeQuery = true)
void upsertWatchdog(Long id, Date a, Long id2, Date a2);

关键部分是在命名的/定位的参数和分号之间使用空格,因为hibernate将命名的/定位的参数名称视为ID;而不是身份证。

但我不确定它的工作是因为它是一个特性,还是因为它是一个bug;-)

 类似资料:
  • 我在JPA实体上拥有以下财产: 如果置信度设置为“0.000”,例如:setConfidence(新的BigDecimal(“0.000”));然后实体被持久化到数据库中,然后从数据库中取回,取回的值将失去其精度和规模,仅为0。 数据库模式是在部署Web应用程序时由JPA/Eclipselink创建的。 我的环境是EclipseLink 2.3.2。v20111125-r10461,Oracle

  • 问题内容: 我需要在Spring Data Repository中使用原始SQL,这可能吗?我看到的所有内容始终都是基于实体的。 问题答案: @Query批注允许通过将nativeQuery标志设置为true来执行本地查询。 引用Spring Data JPA 参考文档。

  • 是否可以在Spring Repository@Query注释中使用Array对象作为参数? 我正在尝试检索列节点存在于字符串数组中的表中的所有行。是否可以使用Spring存储库中的@Query注释一次执行此操作? 这是我的位置实体: 其中node引用node类,它在数据库中作为BIGINT映射。 我有这样一个存储库: 在那里,您可以看到我试图执行的查询,但它不起作用。我不知道是否可以在那里使用数组

  • 我试图用SpringBoot 1.5.13和spring-security-oauth2 2.0.15实现一个OAuth2客户机。 我希望能够授权匿名用户与auth_code GRANT。然而,当我试图完成auth流时,我遇到了一些问题。因为我不想调用任何其他外部服务来获取用户标识信息,所以我使用。需要一个标记存储来进行操作,所以我提供了最简单的标记存储--。 我尝试了两种方法,但都失败了: 如果

  • 我在JPA和MySQL后端中使用Spring-Boot。现在,我对Spring-Boot提供的存储库感到非常困惑。我知道这些功能非常强大(而且似乎非常有用,因为它们可以大大缩短代码)。但是,我不明白如何表示它们中的联接,因为结果集应该是选择几个实体中指定属性的组合。 现在假设我们有三个表、、,其中最后一个表通过一个组合的主键简单地连接和。我想我们有以下Java类:

  • 问题内容: 我可以在JSON文件中使用注释吗?如果是这样,怎么办? 问题答案: 没有。 JSON应该都是数据,如果包含注释,那么它也将是数据。 您可能有一个称为(或其他名称)的指定数据元素,使用JSON数据的应用程序会忽略该数据元素。 在生成/接收JSON的过程中添加注释可能会更好,因为它们应该事先知道什么是JSON数据,或者至少知道其结构。 但是,如果您决定: