将MySql视图Map到JPA对象,使用哪个唯一id?

disbfnqx  于 12个月前  发布在  Mysql
关注(0)|答案(2)|浏览(123)

所以我在项目中使用视图而不是结果查询作为实体,我知道我并不孤单,所以,我的问题是:
在处理视图时,你用什么来充当as和@Id?有时这个问题的答案很简单,但有时当你没有一个独特的字段时,你会怎么做?
现在,我在一个特定的视图中包含了更多需要的字段,这样我就可以拥有一个混合的字段,这些字段都是唯一的,我对每个字段都使用了@Id注解,到目前为止,它工作得很好。
这似乎是如此的上下文,我一直在问自己,是否有一个更标准的方式来做这件事。

yizd12fk

yizd12fk1#

我不认为有一个标准的方法,但这里的方法似乎值得一试。
想法是为视图动态生成唯一的“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将给予连续的行号,例如,第一次以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)。
希望能帮上忙。

xtfmy6hx

xtfmy6hx2#

如果不进行以下更改,无法使上述代码工作。
CREATE VIEW v_test1 SELECT a.field1,func_inc_var_session(1)as rownum FROM test_table a
CREATE VIEW v_reset AS SELECT func_inc_var_session(*0 *);
主视图(v_test1)每次需要重置为1。v_reset函数每次需要“重置”为零(0)。

相关问题