Hibernate - многие-к-одному, используя addJoin - PullRequest
2 голосов
/ 13 июня 2011

У меня есть отношение многие-к-одному, когда объект MessageContents имеет набор сообщений, а каждое сообщение имеет внешний ключ к MessageContents.

У меня есть следующий запрос:

String sqlQuery = "SELECT " +
                  " {msg.*}, "+
                  " {msc.*} "+
                  "FROM analyticsintegrationservices.Messages AS msg " +
                  "LEFT OUTER JOIN analyticsintegrationservices.message_contents AS msc " +
                  " ON msg.content_key = msc.unique_key " +
                  "WHERE msg.sequence_received < 10";

Когда я запрашиваю его, я хочу, чтобы Hibernate отобразил набор результатов в список объектов Messages.Когда я пробую следующий код, я получаю набор результатов MessageContents:

Query query = session.createSQLQuery( sqlQuery )
                    .addEntity( "msc", MessageContents.class )
                    .addJoin( "msg", "msc.message" )
                    .addJoin( "msc", "msg.messageContents" );
query.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY );
//query.list() returns a list of MessageContents.

Однако, когда я запускаю следующий код, я получаю исключение "org.hibernate.type.SetType не может быть приведен к org.hibernate.type.EntityType "

Query query = session.createSQLQuery( sqlQuery )
                     .addEntity( "msg",Messages.class )
                     .addJoin( "msc","msg.messageContents" )
                     .addJoin( "msg", "msc.message" );
query.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY );
// org.hibernate.type.SetType cannot be cast to org.hibernate.type.EntityType

Принятие происходит в строке

 .addJoin( "msg", "msc.message" );

Как получить список сообщений с помощью sqlQuery?

Ответы [ 3 ]

4 голосов
/ 20 июня 2013

Если ваши сопоставления верны, вы должны сделать следующее:

Query query = session.createSQLQuery( sqlQuery )
                     .addEntity("msg", Messages.class )
                     .addJoin("msc", "msg.messageContents" ).
                     .addEntity("msg", Messages.class)
                     .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

List<MessageContents> yourList = query.list(); 

yourList будет содержать список сущностей MessageContents, в которых сущности messageContents ассоциации полностью инициализированы.

            .addEntity("msg", Messages.class)

необходимо, потому что

            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

работает с последней добавленной сущностью.

0 голосов
/ 14 июня 2011

Является ли sequence_received id или ключ-свойство в вашем файле HBM для MessageContent? Если это так, то почему бы вам не использовать метод session.load () , который автоматически позаботится о вас, дети и все такое,

и если этот столбец не является вашим ключевым свойством, тогда я предложу вам использовать Критерии , которые будут работать правильно, пока обе ваши сущности не будут связаны.

но эти случаи помогут только в том случае, если вы правильно сопоставили оба свойства в файле HBM.

0 голосов
/ 14 июня 2011

Вы сказали, что MessageContents будет иметь набор сообщений, поэтому я предполагаю, что msc.message объявлено как установленное в вашем отображении.Тем не менее, вы объявляете msg как сущность и пытаетесь присвоить ей значение set.Это вызывает ошибку.Вы должны придерживаться своего первого объявления, поскольку MessageContents является вашим основным объектом.

Кстати, ошибка относится ко всему вашему утверждению, а не только к последнему .addJoin, это просто последняя строка этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...