【问题标题】:Define an entity for a denormalized table in JPA (acts as aggregator)在 JPA 中为非规范化表定义实体(充当聚合器)
【发布时间】:2016-09-05 19:46:48
【问题描述】:

我正在疯狂地试图找到映射以下遗留(不可修改)表的方法

 id| ref | lang | text
 ---------------------
 1   666    en     hello
 2   666    es     hola
 3   666    de     hallo
 4   667    en     goodbye
 5   667    es     adios
 6   667    de     tschuss 

进入一个类似的实体

@Id
@Column
private Long ref;

??@Column
??Map<String,String> textByLang;

有可能吗?我什么都试过了

【问题讨论】:

  • Map 表示一个集合值关联。一个实体代表一行,如果您以这种方式设计您的实体,则 Map 仅包含每行的一个键值对。我认为你应该重新考虑你的方法。
  • @AsSiDe 抱歉,我忘了考虑将 Id(错误地)放置在示例中是完全没有意义的。请重新检查更新的解释
  • 一样,我建议使用 Embeddable 而不是 Map。
  • Embeddable 不会聚合列,对吧?
  • 而且,embeddable 是基表的一部分。我需要一个非唯一的 fk 的连接

标签: java hibernate jpa spring-data-jpa jpa-2.0


【解决方案1】:

这很难,因为你在这里破坏了 ORM。根据我的经验,通常这不值得。

如果绝对有必要,我建议根本不要映射langtext,将您的textByLang 标记为@Transient,并使用本机查询将结果映射到中间实体。

List<IntermediateText> results = em.createNativeQuery("SELECT ref, lang, text from Table t", IntermediateText.class).getResultList();

Map<Integer, Map<String, String>> texts = new HashMap<>();

for (IntermediateTextt : results) {
    texts.putIfAbsent(t.getId(), new HashMap<>()).put(t.getLang(), t.getText());
}

// Create your actual objects here

另外,如果可能,请查看(非JPA)JDBCTemplate: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2021-05-06
    • 2021-12-06
    • 2017-04-26
    • 2018-02-05
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多