使用泛型类型编写 HQL UPDATE 查询

Posted

技术标签:

【中文标题】使用泛型类型编写 HQL UPDATE 查询【英文标题】:Write HQL UPDATE query with generic type 【发布时间】:2019-02-01 08:18:35 【问题描述】:

我有一个通用的 tokenRepository 接口:

public interface TokenRepository<T_Token extends Token, T_id> 

   @Modifying
   @Query("UPDATE T_token as a SET a.revocationReason = :reason WHERE a.id = :id")
   void revokeByTokenId (@Param("id") T_id id, @Param("reason") RevocationReason revocationReason);


还有一个专门的存储库接口:

public interface CustomerTokenRepository extends Repository<CustomerToken, Long>, TokenRepository<CustomerToken, Long> 

当我启动 Spring Boot 应用程序时,休眠返回以下错误:

org.hibernate.hql.internal.ast.QuerySyntaxException: T_token is not mapped [UPDATE T_token as a SET a.revocationReason = :reason WHERE a.id = :id]

所以我的问题是:是否有可能以及如何将 java 泛型类型与 HQL 一起使用?

谢谢!

【问题讨论】:

【参考方案1】:

是的,有可能

@Modifying
   @Query("UPDATE ##entityName as a SET a.userRevocationReason = :reason WHERE a.refreshToken.id = :rid")
   void revokeByRefreshToken (@Param("rid") T_id refreshTokenId, @Param("reason") UserRevocationReason userRevocationReason);

实体名称为@Entity(name = "my_entit_name")

【讨论】:

谢谢! @Entity(name = "my_entit_name") 是否必须在 CustomerToken 实体上?在 HQL 文档##entityName 哪里可以找到这个? 是的,我在这里读过这个docs.spring.io/spring-data/jpa/docs/current/reference/html/… 该部分是 5.3.7。使用 SpEL 表达式 确保基础接口仓库使用@NoRepositoryBean注解

以上是关于使用泛型类型编写 HQL UPDATE 查询的主要内容,如果未能解决你的问题,请参考以下文章

Java集合框架--泛型类 & 泛型接口

java中啥是泛型,怎么用泛型?

Kotlin泛型 ① ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 )

使用泛型实现栈结构

(十七)泛型程序设计

是否可以使用 .NET 泛型类实现 COM 接口?