java - 在 JPA 中为非规范化表定义一个实体(充当聚合器)

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

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

 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。根据我的经验,通常这是不值得的。

如果绝对必要,我建议根本不要映射 langtext,将 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/

相关文章:

spring - 没有找到能够从类型转换为类型的转换器

java - 如何将 jar 附加到正在执行作业的 Spark 集群?

java - 在 RxJava 中使用 else 语句

java - 如何在 java 中基于扩展的 ascii 拆分字符串

java - 如何在 JUnit 测试中覆盖私有(private)方法

hibernate - 如何使用 JPA CriteriaBuilder 查询执行外连接?

java - Spring JPA 和 Hibernate 的 JPQL 查询错误

java - 如何让 Spring JPA、Hibernate 和 OSGi 发挥出色?

java - 如何确保 hibernate 5 在与共享主键的一对一关系中以正确的顺序持续存在

带有更改 where 子句的 JPA 查询