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

ale*_*lex 5 mysql jpa views

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

使用视图时,您用作和@Id的用途是什么?有时候,这个问题的答案是微不足道的,但是有时候当您没有一个引人注目的独特领域时,你们会做什么?

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

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

a1e*_*x07 2

我认为没有标准的方法,但这里的方法似乎值得尝试。

想法是为 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
     //
Run Code Online (Sandbox Code Playgroud)

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

CREATE VIEW v_test1 
SELECT a.field1 
FROM test_table a  
Run Code Online (Sandbox Code Playgroud)

将其修改为

CREATE VIEW v_test1 
SELECT a.field1,  func_inc_var_session(0) as rownum 
FROM test_table a
Run Code Online (Sandbox Code Playgroud)

会做这项工作;但是,select * from v_test在一个会话中多次运行将为您提供连续的 rownum,例如,第一次以 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
Run Code Online (Sandbox Code Playgroud)

(首先处理的 FROM 子句,func_inc_var_session(1)在查询期间只会执行一次,因此会重置 rownum)。

我希望它有帮助。