使用 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 从地图中的表中加载数据作为列名与值的主要内容,如果未能解决你的问题,请参考以下文章

从不同视图的表中加载 WebView

iOS Web-App从Chrome中的数据库加载,但不在Safari中加载

使用 Spring Boot 进行测试时仅从测试/资源中加载数据

从 JPA/Hibernate 中的视图加载实体

在Arcmap中加载互联网地图资源的4种方法(转载)

谷歌地图未在 js 选项卡中加载