如何使用 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 创建视图?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当我将 hbm2ddl.auto 设置为创建时,Hibernate 会抛出 SQLGrammarException 说表/视图不存在?