微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

休眠-使用addJoin多对一

如何解决休眠-使用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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?