如何在 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 视图的主要内容,如果未能解决你的问题,请参考以下文章