使用 Hibernate 从地图中的表中加载数据作为列名与值
Posted
技术标签:
【中文标题】使用 Hibernate 从地图中的表中加载数据作为列名与值【英文标题】:Loading data from a table in a Map as Column Name Vs Value using Hibernate 【发布时间】:2013-05-07 08:22:34 【问题描述】:我使用 Hibernate 已经有一段时间了,这次我想在这里做一些非常规的事情。甚至不确定它是否可能。
我想要做的是从单个表中加载数据,其中少数列将为它们定义字段以供休息(几乎 20 左右,并且可以随时间增加)所有整数,我想加载它们一张地图。这样 Column 的名称成为键,数据成为它的值。
我正在使用 Hibernate 4.1.4 并使用注释来映射字段和列。
进一步澄清: 表定义:
CREATE TABLE TempTable
(
id SERIAL,
revId TEXT,
type INTEGER,
group INTEGER,
col_1 INTEGER,
col_2 INTEGER,
col_3 INTEGER,
col_4 INTEGER,
col_5 INTEGER,
col_6 INTEGER,
col_7 INTEGER,
col_8 INTEGER,
col_9 INTEGER
DAO 模型看起来像
@Entity
@Table(name = "TempTable")
public class StatsModel
private Long entryId;
private String revId;
private Integer type;
private Integer group;
private Map<String, Integer> metrics; // Map in which I want columns col_1 to col_9 as "Column Name" Vs. "Value"
@Id
@Column(name = "id", columnDefinition = "serial")
@Generated(GenerationTime.INSERT)
public Long getEntryId()
return entryId;
public void setEntryId(Long entryId)
this.entryId = entryId;
@Column(name = "tx_rev")
public String getRevId()
return revId;
public void setRevId(String revId)
this.revId= revId;
@Column(name = "nu_type")
public Integer getType()
return type;
public void setType(Integer type)
this.type = type;
@Column(name = "nu_group")
public Integer getGroup()
return group;
public void setGroup(Integer group)
this.group = group;
【问题讨论】:
您的意思是命名策略?或者你想加载没有注释的字段? @Ziul 对不起,我不明白。我不确定是否有任何注释可用于直接在地图中从表中加载数据。此外,这是我试图从中读取的单个表。这里没有 JOIN 或任何东西,只有 1 个表和 1 个 DAO 模型。 @Ziul 我已经进一步更新了问题文本以添加我试图从中读取数据的表模式。我希望这能更好地解释我的问题。 【参考方案1】:您可以将数据加载为更改查询的地图,这是休眠文档示例:
select
new map(
max(bodyWeight) as max,
min(bodyWeight) as min, count(*) as n
)
from Cat cat
http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-select
【讨论】:
【参考方案2】:可以使用剩余列的视图来“透视”这些列。然后映射这个视图,例如像这样创建的视图(请注意,即使是视图的 DDL 也可以通过读取数据库的数据字典来动态创建,但这是另一个问题!)
创建或替换视图 TempTable_metrics 为 选择 t.id, pv.name 作为键, 案子 当 pv.name = 'COL1' 然后 t.col1 当 pv.name = 'COL2' 然后 t.col2 当 pv.name = 'COL3' 然后 t.col3 以价值结束 从 temp_table t, ( 从双重联合中选择“COL1”作为名称 从双重联合中选择“COL2”作为名称 从双重中选择“COL3”作为名称 ) 光伏已编辑:(添加如何执行休眠部分) 忘了提一下,在 java 方面,您的地图需要这些注释:
@CollectionTable(name="TempTable_metrics", joinColumns=@JoinColumn(name="id")) @MapKeyColumn(name="key", nullable=false) @Column(name="值") Map刚刚意识到,为了进行更新,您需要在数据库中使用一些凌乱的“而不是”触发器(我已经使用 Oracle 完成了此操作,但在其他地方使用了 YMMV)。
【讨论】:
以上是关于使用 Hibernate 从地图中的表中加载数据作为列名与值的主要内容,如果未能解决你的问题,请参考以下文章
iOS Web-App从Chrome中的数据库加载,但不在Safari中加载