使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?

Posted

技术标签:

【中文标题】使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?【英文标题】:Using ORM, can I map a DB table with columns a, b, c to a class with a Map with keys a, b, c? 【发布时间】:2014-10-23 13:21:21 【问题描述】:

例如,假设我们有一个这样的数据库表 Person:

|---------------|
|Name|Age|Height|
|---------------|
|Bob | 34|   167|
|Jane| 76|   181|
|Joe | 55|   176|
|---------------|

使用 Java 中的 ORM 框架(Hibernate、Spring Data JPA 等),我可以将此表映射到这样的类吗:

public class Person 
  private Map<String, Object> attributes;
  // No other fields!
  ..

例如在哪里表的第一行将由 Person 对象表示,其 attributes 字段等于:

"Name" -> "Bob", "Age" -> 34, "Height" -> 167

如果这是可能的,我会怎么做?非常感谢!

【问题讨论】:

FWIW "Spring Data JPA" 不是 ORM,只是使用真正的 JPA 实现。就您的问题而言,如果那是一个连接表,那么它可以表示一个地图,并且“名称”是一个人表的 FK 列。 【参考方案1】:

您可以编写自己的实用程序,使用反射通过 Java 属性(或 getter)并为您构建该映射。

【讨论】:

【参考方案2】:

我认为你不能完全做到这一点。一种选择是使用constructor expressions,拥有一个带有属性映射的“视图对象”,并从查询中返回它,但您仍然必须将一个普通实体映射到数据库表。在这种情况下,您的查询看起来像这样

select new my.package.PersonVO(p) from Person p...

你只需要在 PersonVO 中有一个合适的构造函数

public PersonVO(Person person) 
    attributes.put("name", person.getName());
    ...

【讨论】:

以上是关于使用 ORM,我可以将带有 a、b、c 列的 DB 表映射到带有带有键 a、b、c 的 Map 的类吗?的主要内容,如果未能解决你的问题,请参考以下文章

SQLAlchemy ORM 不能使用复合外键

在Dynamo DB中索引本地二级索引

Django ORM查询无法选择新对象

在 Dynamo DB 中对本地二级索引进行索引

ORM 或其他东西可以有效地处理带有 order 列的 SQL 表

对于带有 Derby db 的 Spring MVC 项目,我应该使用啥 ORM?