使用 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 的类吗?的主要内容,如果未能解决你的问题,请参考以下文章