将 MySql 视图映射到 JPA Entitites,使用哪个唯一 id?

问题描述 投票:0回答:2

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

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

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

这似乎是很切合实际的,我一直在问自己是否有更标准的方法来做到这一点。

mysql jpa view
2个回答
2
投票

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

想法是为视图动态生成唯一的“id”值(类似于 rownum )。来自 Create a view with 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)。

我希望它有帮助。


0
投票

如果不进行以下更改,则无法使上述代码正常工作。

创建视图 v_test1 选择a.field1,func_inc_var_session(1)作为rownum 来自测试表a

创建视图 v_reset AS SELECT func_inc_var_session(0);

主视图(v_test1)每次都需要重置为1。 v_reset 函数每次都需要“重置”为零 (0)。

© www.soinside.com 2019 - 2024. All rights reserved.