休眠-使用addJoin多对一

问题描述

| 我有一个多对一的关系,其中MessageContents对象具有一组消息,而每个Message都有一个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\";
查询它时,我希望休眠将结果集映射到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获取消息列表?     

解决方法

        您的HBM文件中的MessageContent是否有“ 4”的ID或密钥属性?如果是这样,那为什么不使用session.load()方法,它将自动照顾您的孩子和所有人, 如果该列不是您的密钥属性,那么我建议您使用Criteria,它将正确使用,直到两个实体都相关为止。 但是这些情况仅在您正确映射了HBM文件中的两个属性的情况下才有用。     ,        假设您的映射正确,则应执行以下操作:
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);
对最后添加的实体进行操作。     ,        您说“ 8”将具有一组消息,因此我假设在映射中已将“ 9”声明为已设置。但是,您将“ 10”声明为实体,然后尝试将其分配给set。这会导致错误。您应该坚持第一个声明,因为“ 8”是您的主要对象。 顺便说一句,错误适用于您的整个语句,而不仅仅是最后的
.addJoin
,它恰好是它的最后一行。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...