在hibernate实体上处理数据库视图的优雅方法?

我使用Hibernate的一个主要原因是它提供了切换到另一个数据库的灵活性,而无需重写任何代码。

但到目前为止,我还没有想出一个很好的方法来定义我的hibernate实体匹配的表的其他视图; 我仍在使用简单的SQL脚本。 有没有更优雅的方法来定义由hibernate管理的表的视图?

理想情况下,我想使用HQL或其他通用方法来完成这项工作,这样我就不必担心我的SQL脚本与其他类型的数据库不兼容。

如果有办法实现这一点,那么第二个问题就是从这些视图中获取“合成”只读实例,这样可以更容易地将聚合数据提供给UI。

编辑:

好像我没有把问题弄清楚,所以这就是我想要做的事情:我想编写独立于使用过的数据库的代码。 由于我使用hibernate,我只需要更改方言配置文件,然后可以使用另一个DBMS。

问题:如何在依赖特定SQL方言(保持一切可移植性)甚至是HQL的情况下在我的hibernate实体上创建视图 ? 如果可能的话,我可以使用HQL查询这些视图,即创建只读聚合实体吗? 是否有任何额外的hibernate插件来帮助我? 到目前为止还没找到任何东西…: – /

Hibernate不会自动为您创建视图,因为每个方言仅支持底层数据库的数据定义语言(DDL)的有限子集。 基本上,它支持足够的DDL来生成工作模式,但不足以处理视图等“额外”对象的创建。

不过,一切都不会丢失。 Hibernate确实使您能够在XML映射文件中自己创建(和删除)其他数据库对象,并且这些对象可以作用于特定方言。 例如,我可以有这样的映射:

        create or replace view read_only_cust... drop view read_only_cust    

您可以通过添加更多“数据库对象”部分来自由创建所需的任何其他视图。 您必须自己为要支持的每个数据库编写SQL(DDL),但由于它们的范围是方言,因此Hibernate只会为在模式导出时选择的方言执行SQL。

有同样的问题,并在hibernate doucmentation中找到以下解决方案:

Hibernate映射的视图和基表之间没有区别。 这在数据库级别是透明的,尽管某些DBMS不能正确支持视图,尤其是对于更新。 有时您希望使用视图,但无法在数据库中创建视图(即使用旧模式)。 在这种情况下,您可以将不可变和只读实体映射到给定的SQL子选择表达式:

   select item.name, max(bid.amount), count(*) from item join bid on bid.item_id = item.id group by item.name     ...  

https://docs.jboss.org/hibernate/stable/core/manual/en-US/html_single/#mapping-declaration

你是什​​么意思“创造观点”? 我知道纯数据库环境意味着什么 – 但这不是你的意思 – 对吧?

您可以将新Java类映射到相同的表以创建“视图”,也可以使用HQL选择由其他持久类映射的列的子集。

HTH

你能直接在数据库中声明视图吗? 然后您可以直接从视图中选择。 看看Hibernate手册的10.4.4章节

这应该允许您从数据库视图中选择SELECT并让Hibernate自动将数据水合成您的实体。

当然,视图不带任何参数。 Hibernate 3应该支持存储过程,但我已经使用过了。