0

我使用 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;
    }
}
4

2 回答 2

0

可以使用剩余列的视图来“旋转”这些列。然后映射这个视图,例如像这样创建的视图(注意即使是视图的 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<String,Integer> 指标;

刚刚意识到,为了进行更新,您需要在数据库中使用一些凌乱的“而不是”触发器(我已经使用 Oracle 完成了此操作,但在其他地方使用了 YMMV)。

于 2013-05-13T18:39:02.913 回答
0

您可以将数据加载为更改查询的地图,这是休眠文档示例:

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

于 2013-05-13T19:27:35.733 回答