如何使用 Hibernate 创建视图?

Posted

技术标签:

【中文标题】如何使用 Hibernate 创建视图?【英文标题】:How to create Views using Hibernate? 【发布时间】:2014-05-07 02:33:06 【问题描述】:

我正在使用 Hibernate 和 Struts2。另外,我在 DBForge Studio for mysql 中有我的数据库。

我想要做的是使用来自多个表的信息加载一个对象(例如“产品”)。假设我有使用 ID 引用它们的外键。简而言之,如何使用 Hibernate 创建多个表的视图。

有什么想法吗?

【问题讨论】:

docs.jboss.org/hibernate/core/3.5/reference/en/html/… 5.1.3 节课 这能回答你的问题吗? Creating views through hibernate 【参考方案1】:

简而言之,你没有。 AFAIK,没有办法使用 Hibernate 或 JPA 创建数据库视图。

您可以使用简单的投影查询,加入实体:

select a.x, b.y
from A a join B b where a.z = b.z

或使用NEW 运算符将结果映射到 DTO:

select new com.acme.MyDto(a.x, b.y)
from A a join B b where a.z = b.z

如果您已经有一个 DB 视图,您可以将其映射到常规实体类并查询该实体。

【讨论】:

【参考方案2】:

来自JAVA Persistence Api book 的示例。

@Entity @org.hibernate.annotations.Immutable 
@org.hibernate.annotations.Subselect(
    value = "select i.ID as ITEMID, i.ITEM_NAME as NAME, " + 
            "count(b.ID) as NUMBEROFBIDS " +
            "from ITEM i left outer join BID b on i.ID = b.ITEM_ID " + 
            "group by i.ID, i.ITEM_NAME")
@org.hibernate.annotations.Synchronize("Item", "Bid")
public class ItemBidSummary 

@Id
protected Long itemId;

protected String name; 

protected long numberOfBids;

public ItemBidSummary()  

// Read methods... // ...

ItemBidSummary itemBidSummary = em.find(ItemBidSummary.class, ITEM_ID);

// will produce
// select * from (
//     select i.ID as ITEMID, i.ITEM_NAME as NAME, ...
// ) where ITEMID = ?

【讨论】:

【参考方案3】:

可以在这些简单的步骤中完成。

第 1 步。

用你需要的所有变量创建一个类

第 2 步。

创建一个以所有变量为参数的构造函数,如

className(String name,int rollNUmber)
this.name=name;
this.rollNumber=rollNumber;

第 3 步

执行这个查询

select new com.path.ClassName(columnName1,columnName2) from tableName where Conditions;

注意 查询返回的值的类型(列)必须适合构造函数参数。

【讨论】:

这不是“视图”概念。

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

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

使用 Hibernate 调用数据库视图

使用视图作为 Hibernate 的连接表

为啥当我将 hbm2ddl.auto 设置为创建时,Hibernate 会抛出 SQLGrammarException 说表/视图不存在?

hibernate之处理视图

Hibernate、MySQL 视图和 hibernate.hbm2ddl.auto = 验证