如何在 Hibernate 中创建/调用 sql 视图

Posted

技术标签:

【中文标题】如何在 Hibernate 中创建/调用 sql 视图【英文标题】:How to create/call a sql view in Hibernate 【发布时间】:2014-01-21 10:09:25 【问题描述】:

这是在document.hbm.xml创建的视图

<database-object>
    <create><![CDATA[CREATE VIEW docView
     AS
     SELECT * from document;
     GO]]></create>
    <drop>DROP VIEW docView</drop>
    <dialect-scope name='org.hibernate.dialect.SQLServerDialect' />
</database-object> 

现在如何在我的方法中调用这个视图

试过这样打电话

Session session = sessFactory.openSession();
Query query = session.createSQLQuery("docView");
List<?> list = query.list();

结束了

Caused by: java.sql.SQLException: The request for procedure 'docView' failed because 'docView' is a view object.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2820)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2258)
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:632)

在休眠中调用sql视图的任何想法或任何其他方式?

简而言之,有没有办法像 Is there any way to call view just like a stored procedure??,无需创建新实体??

【问题讨论】:

【参考方案1】:

您可以像使用常规实体表一样使用数据库视图。使用 @Entity 注释或等效的 XML 和视图列的任意子集作为字段定义实体类。

重要的一点是您不应该更改实体中的值,因为视图是只读的。

编辑:我不知道使用存储过程之类的视图的方法。如果您的存储过程的目的是查询评论中暗示的多个实体,您可以:

使视图足够“广泛”以包含所需实体的所有必要属性 使用视图中的外键列和映射到视图的实体的常规 @*To* 注释与相关实体相关。

恐怕这不会让您走得太远,因为您仍然必须使用本机 SQL 或定义实体。

【讨论】:

有什么方法可以调用viewjust like a stored procedure??【参考方案2】:

创建一个实体将其映射到您的视图,然后使用它来查询您的视图

@Entity
@Table(name = "docView")
public class DocView 

    // Put all fields that you use in your view
    documentField1;
    documentField2;
    .
    .

然后你可以这样查询:

Session session = sessFactory.openSession();
Query query = session.createSQLQuery("from DocView");
List<?> list = query.list();

【讨论】:

【参考方案3】:

Hibernate 视图不是命名查询。您可以在数据库中创建视图,然后在创建实体 pojos 时考虑到该视图。 Hibernate 会将这些实体视为映射到视图,然后您可以像通常对休眠实体一样执行操作。

    您正在编写一个创建 DDL 查询来创建视图,该视图只有在 hbm2ddl 属性设置正确时才会被调用。 创建视图是一个 DDl 查询,它不返回值列表。您不能像调用命名 sql 查询一样调用创建视图查询 创建视图后,您可以编写命名的 sql 查询,该查询可以从视图中检索数据。为此,您只需要一个 POJO,它映射到视图和命名查询以获取数据。

【讨论】:

你能参考一下吗? ***.com/questions/901537/…,我在这里错过了什么吗? 您可以这样写,如果您的 hbm2ddl 属性设置正确,hibernate 将创建视图,但您不能将视图查询称为 SQL 命名查询,因为它是 DDL 查询而不是返回列表的查询.

以上是关于如何在 Hibernate 中创建/调用 sql 视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时在 Hibernate 中创建数据库?

如何在 IntelliJ 和 H2 中创建 Hibernate 映射

如何在 Hibernate 中创建多态/通用多对多关系?

在 Hibernate 中的启动数据库中创建 mysql

避免在 Hibernate 5.1.0 中创建全局临时表

Hibernate 不使用 Spring boot 在 PostgreSql 中创建数据库