【问题标题】:hibernate - many-to-one using addJoinhibernate - 使用 addJoin 的多对一
【发布时间】:2011-09-14 02:25:55
【问题描述】:

我有一个多对一的关系,其中一个 MessageContents 对象有一组 Messages,每个 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";

当我查询它时,我希望 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 cannot be cast to 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 获取消息列表?

【问题讨论】:

    标签: java sql hibernate hibernate-mapping


    【解决方案1】:

    假设你的映射是正确的,你应该这样做:

    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);
    

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

    【讨论】:

      【解决方案2】:

      消息内容的 HBM 文件中是否有 sequence_received id 或密钥属性?如果是,那你为什么不使用session.load() 方法,它会自动照顾你的孩子和所有人,

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

      但这些情况只有在您正确映射 HBM 文件中的两个属性时才会有所帮助。

      【讨论】:

      • 我没有一个 HBM 文件。我所有的配置都是通过注释完成的。 sequence_received 只是一个属性,它不是 ID 或键属性。对于公司的政策来说,使用 Criteria 也是不可能的(我们不希望 hibernate 生成任何 SQL 代码,因为我们不相信它的代码是最优的)
      • @iliaden : 我们不想依赖休眠来生成 sql 语句,那么我建议不要休眠。
      【解决方案3】:

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

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

      【讨论】:

      • 当我说导致异常的原因时,我的意思是通过删除该行,它可以正确编译,但缺少正确的映射。另外:有没有办法指定结果映射到的类的类型?我需要一个 Messages 作为主要对象,而不是 MessageContents
      猜你喜欢
      • 2011-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 2013-03-04
      • 2011-03-14
      • 1970-01-01
      相关资源
      最近更新 更多