Java hibernate-使用addJoin实现多对一

Java hibernate-使用addJoin实现多对一,java,sql,hibernate,hibernate-mapping,Java,Sql,Hibernate,Hibernate Mapping,我有一个多对一关系,其中MessageContents对象有一组消息,每条消息都有一个MessageContents的外键 我有以下疑问: String sqlQuery = "SELECT " + " {msg.*}, "+ " {msc.*} "+ "FROM analyticsintegrationservices.Messages AS msg " +

我有一个多对一关系,其中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";
但是,当我运行以下代码时,会出现异常“org.hibernate.type.SetType不能强制转换为org.hibernate.type.EntityType”

该选项发生在该行

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

如何使用sqlQuery获取消息列表?

您说过
MessageContents
将包含一组消息,因此我假设
msc.message
在您的映射中声明为set。但是,您将
msg
声明为实体,并尝试将其分配给set。这导致了错误。您应该坚持第一个声明,因为
MessageContents
是您的主要对象


顺便说一下,这个错误适用于整个语句,而不仅仅是最后一行。addJoin它恰好是它的最后一行

您的HBM文件中是否接收到消息内容的
sequence\u
id或key属性?如果是,那你为什么不使用这个方法,它会自动照顾你的孩子和所有人

如果该列不是您的键属性,那么我建议您使用,这将是正确的,直到您的两个实体都相关


但是,只有当您在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(); 
是必要的,因为

            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

对添加的最后一个实体进行操作。

当我说是什么导致异常时,我的意思是通过删除该行,它可以正确编译,但缺少正确的映射。另外:是否有方法指定结果映射到的类的类型?我需要一个消息作为主要对象,而不是消息内容。我没有一个HBM文件。我的所有配置都是通过注释完成的。接收的序列_只是一个属性,而不是ID或key属性。使用标准对于公司的策略也是不可能的(我们不希望hibernate生成任何SQL代码,因为我们不相信它的代码是最优的)@iliaden:我们不希望依赖hibernate生成SQL语句,那么我建议Guest不要休眠。
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(); 
            .addEntity("msg", Messages.class)
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);