我正在疯狂地尝试找到映射以下旧(不可修改)表的方法
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;
这可能吗?我尝试了一切
最佳答案
这很难,因为你在这里破坏了 ORM。根据我的经验,通常这是不值得的。
如果绝对必要,我建议根本不要映射 lang
和 text
,将 textByLang
标记为 @Transient
,并使用 native 查询将结果映射到中间实体。
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
关于java - 在 JPA 中为非规范化表定义一个实体(充当聚合器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336823/