将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?

Posted

技术标签:

【中文标题】将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?【英文标题】:Mapping MySql views to JPA Entitites, which unique id to use? 【发布时间】:2014-08-19 13:57:55 【问题描述】:

所以我一直在项目中使用视图而不是结果查询作为实体,我知道我并不孤单,所以,我的问题:

在处理视图时,您使用什么来充当和@Id?有时这个问题的答案是微不足道的,但有时当你没有一个独特的领域脱颖而出时,你们会怎么做?

现在我在特定视图中包含了更多我需要的字段,因此我可以将唯一的字段混合在一起,并且我对每个字段都使用 @Id 注释,到目前为止它一直在工作很棒。

这似乎与上下文有关,我一直在问自己是否有更标准的方法。

【问题讨论】:

【参考方案1】:

我不认为有一个标准的方法,但这是似乎值得尝试的方法。

想法是为 view 动态生成唯一的“id”值(类似于 rownum )。来自 Create a view with column num_rows - mysql 的函数的一点修改版本(为了重置 rownum 所做的修改):

delimiter //

CREATE FUNCTION `func_inc_var_session`( val int) RETURNS int
    NO SQL
    NOT DETERMINISTIC
     begin
        if val = 0 THEN set @var := -1; end if;
      SET @var := IFNULL(@var,0) + 1;
      return @var;
     end
     //

假设我们有一个视图定义(出于说明目的,过于简化了)

CREATE VIEW v_test1 
SELECT a.field1 
FROM test_table a  

修改为

CREATE VIEW v_test1 
SELECT a.field1,  func_inc_var_session(0) as rownum 
FROM test_table a

会做这项工作;但是,在一个会话中多次运行 select * from v_test 会给您连续的 rownums,例如第一次以 1 开头,第二次以视图中的记录数等开始。

要重置 rownum,我创建了另一个视图(由于 mysql 视图限制 - 它不能在 FROM 中有子查询):

CREATE VIEW v_reset AS SELECT func_inc_var_session(1) ;

现在我们可以做

CREATE VIEW v_test1 
SELECT a.field1,  func_inc_var_session(0) as rownum 
FROM test_table a, v_reset

(FROM子句先处理,func_inc_var_session(1)在查询过程中只执行一次,所以会重置rownum)。

我希望它有所帮助。

【讨论】:

确实如此,我稍后会尝试这种方法。应该提到的是,我拥有的 Java 知识比任何与 SQL 相关的东西都要多,无论是 MySQL 还是其他任何东西。尽管如此,由于这个特殊原因,我发现 MySQL 中“缺少”rownum 有点烦人。

以上是关于将 MySql 视图映射到 JPA 实体,使用哪个唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

在 Spring Boot jpa 中将多个外键映射到同一个主键

JPA 是不是支持映射到 sql 视图?

如何使用 JPA/Hibernate 注释将 MySQL char(n) 列映射到实例变量?

JPA Hibernate 将类中的类中的字段映射到同一个表

处理来自 JPA/DAO 实体的结果中的非 DB 映射字段