2016-09-05 6 views
0

Я получаю с умом, пытаясь найти способ отображения следующего наследия (неизменяемый) столОпределить объект для денормализованнога таблицы в JPA (действует как агрегатор)

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; 

[email protected] 
??Map<String,String> textByLang; 

Возможно ли это? Я пробовал все

+0

Карта представлена ​​коллекция значных ассоциации. Entity представляет строку, и если вы проектируете свою сущность таким образом, Map содержит только одну пару ключ-значение для каждой строки. Я думаю, вы должны пересмотреть свой подход. – AsSiDe

+0

@AsSiDe Извините, я забыл считать, что размещение Id (по ошибке) является совершенно бессмысленным. Повторите проверку обновленного описания – Whimusical

+0

Это то же самое, я предлагаю использовать Embeddable вместо карты. – AsSiDe

ответ

1

Это сложно, потому что вы нарушаете ORM здесь. По моему опыту, обычно это не стоит усилий.

Если это абсолютно необходимо, я бы предложил не картирование lang и text вообще, отмечая ваш 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 

Кроме того, если это возможно, пожалуйста, обратите внимание на (nonJPA) JdbcTemplate: http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html