jpa如何将映射原生视图
jpa有个最恶心的问题就说不支持视图查询,
jpa有个最恶心的问题就说不支持视图查询,
2016-03-13
先前查过一些相关资料,分享一下。希望对你有所帮助!
Oracle数据库对象分五种:表,视图,序列,索引和同义词。视图也是常被程序员所忽略,却又有着重要作用的模块。
一、视图的概念?
视图其实就是一条查询sql语句,也是查询结果,用于显示一个或多个表或其他视图中的相关数据。视图将一个查询的结果作为一个表来使用,因此视图可以被看作是存储的查询或一个虚拟表。视图来源于表,所有对视图数据的修改最终都会被反映到视图的基表中,这些修改必须服从基表的完整性约束,并同样会触发定义在基表上的触发器。一个视图也可以从另一个视图中产生。
二、视图的存储?
它与表不同,视图不会要求分配存储空间,视图中也不会包含实际的数据。视图只是定义了一个查询,视图中的数据是从基表中获取,这些数据在视图被引用时动态的生成。由于视图基于数据库中的其他对象,因此一个视图只需要占用数据字典中保存其定义的空间,而无需额外的存储空间。 不占物理空间,查一次,执行依次sql语句。
三、视图的作用?
视图的强大之处在于它能够根据不同用户的需要来对基表中的数据进行整理。
1|通过视图可以设定允许用户访问的列和数据行,从而为表提供了额外的安全控制
2|隐藏数据复杂性
3|视图中可以使用连接(join),用多个表中相关的列构成一个新的数据集。此视图就对用户隐藏了数据来源于多个表的事实。
4|提供各种数据表现形式, 可以使用各种不同的方式将基表的数据展现在用户面前, 以便符合用户的使用习惯(主要手段: 使用别名)
5|简化用户的SQL语句
6|用户使用视图就可从多个表中查询信息,而无需了解这些表是如何连接的。
7|视图的列名可以被任意改变,而不会影响此视图的基表
8|使应用程序不会受基表定义改变的影响
9|在一个视图的定义中查询了一个包含4 个数据列的基表中的3 列。当基表中添加了新的列后,由于视图的定义并没有被影响,因此使用此视图的应用程序也不会被影响。
10|保存复杂查询
一个查询可能会对表数据进行复杂的计算。用户将这个查询保存为视图之后,每次进行类似计算只需查询此视图即可。
11|逻辑数据独立性
视图可以使应用程序和数据库表在一定程度上独立。如果没有视图,应用一定是建立在表上的。有了视图之后,程序可以建立在视图之上,从而程序与数据库表被视图分割开来。
四、视图的工作机制?
视图的定义就是其使用的查询语句,Oracle 将这个定义以文本形式存储在数据字典中。当用户在 SQL 语句中引用了视图时,它将引用了视图的语句与视图的定义语句整合为一个语句-》在共享SQL 区解析整合后的语句-》执行此语句-》当现有的共享SQL 区中没有与整合后的语句一致时,Oracle 才会为此语句创建新的共享SQL 区。因此,引用了视图的SQL 语句也能够利用已有的共享 SQL 区以达到节约内存和提高性能的目的。
五、视图的依赖性?
由于视图的定义是一个引用了其他对象(表,视图)的查询,因此视图依赖于其所引用的对象。Oracle 会自动地处理视图的依赖性。例如,当用户移除了一个视图的基表后再重建此表,Oracle 将检查新的基表是否符合视图的定义并判断视图的有效性。
六、可更新的连接视图
连接视图是指在一个视图的定义查询的from字句中引用了多个表或视图。而可更新的连接视图是指能够执行 UPDATE,INSERT,和 DELETE 操作的连接视图。为了保证视图是可更新的。
七、语法基本结构?
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name [(alias[, alias]...)]
AS subquery(sql语句)
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY CONSTRAINT]
OR REPLACE:若所创建的试图已经存在,ORACLE自动重建该视图;
FORCE:不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE:只有基表都存在ORACLE才会创建该视图:
alias:为视图产生的列定义的别名;
subquery:一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION : 插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY : 该视图上不能进行任何DML操作。
默认可以通过视图对基表执行增删改操作,但是有很多在基表上的限制(比如:基表中某列不能为空,但是该列没有出现在视图中,则不能通过视图执行insert操作),WITH READ ONLY说明视图是只读视图,不能通过该视图进行增删改操作。现实开发中,基本上不通过视图对表中的数据进行增删改操作。
八、无效语法结构?
1|集合操作符
2|DISTINCT 操作符
3|聚合函数或分析型函数
4|GROUP BY,ORDER BY,CONNECT BY,或 START WITH 字句
5|在 SELECT 之后的列表中使用集合表达式
6|在 SELECT 之后的列表中使用子查询
7|连接(join)(但是有例外情况)
8|对于不可更新的视图,可以利用 INSTEAD OF 触发器对其数据进行修改。
总之,合理使用视图代替sql语句 ,将能大大提高数据的安全性,简化数据库操作,减少不必要的资源损耗。
maven中,先通过jpa,导入视图实体类(用于封装查询出的结果)
视图表示虚拟表,不存在主键,因此导入实体后会报错,说实体类没找到主键id,解决的方法就是:直接加一个@Id无需给定字段映射也可。
我们HIS项目中尝试使用的住院通知视图表创建部分代码。有多表连接查询。
jpa定义的到接口中,使用的查询语句,直接在@Query()中写入查询视图表语句,如果存在条件请写在后头,不要加到视图表查询语句中,因为无法将值传到视图。只能作为视图的额外条件,添加到对象sql语句后面,查询的结果一定要用视图表pojos new 封装存进来,不然直接查询,永远都会只输出第一条数据。
视图查询作用恒大的,它能简化代码量,特别是jpa,不要再为对象名与字段名不一致所烦劳,查一条好像看不出什么,不过当要连接8-9个表时,你去写,人都会晕的,直接使用sql写,as 到视图中,轻而易举。后台代码也会更清晰。
举报