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

时间:2014-08-19 13:57:56

标签: mysql jpa views

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

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

现在我在特定视图中包含了我需要的更多字段,因此我可以将各个字段组合在一起,并在每个字段上使用@Id注释,到目前为止它& #39;一直很好。

这似乎是如此背景,我一直在问自己是否有更标准的方法。

1 个答案:

答案 0 :(得分:2)

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

想法是为视图动态生成唯一的“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)。

我希望它有所帮助。