【问题标题】:How to create/call a sql view in Hibernate如何在 Hibernate 中创建/调用 sql 视图
【发布时间】: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??,无需创建新实体??

【问题讨论】:

    标签: java sql hibernate orm


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    【解决方案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 会将这些实体视为映射到视图,然后您可以像通常对休眠实体一样执行操作。

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

      【讨论】:

      • 你能参考一下吗? stackoverflow.com/questions/901537/…,我在这里错过了什么吗?
      • 您可以这样写,如果您的 hbm2ddl 属性设置正确,hibernate 将创建视图,但您不能将视图查询称为 SQL 命名查询,因为它是 DDL 查询而不是返回列表的查询.
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多