如何解决休眠-使用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
,它恰好是它的最后一行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。