暮月幽 2017-04-17 12:41 采纳率: 0%
浏览 1228

java mybatis一对多返回值的问题详细描述如下,麻烦大侠们帮助下。

 SELECT  spxx.*,spxxlb.splbbh from spxx JOIN spxxlb ON spxx.spbm=spxxlb.spbm ORDER BY spxx.spbm ASC
 查询结果

图片说明

我返回String得到如下结果
图片说明

很明显splbdto只返回了一条数据。

其中配置文件:
图片说明

dto

public class  spxxdto<T> {
    private String spmc;
    private List splb;
    private String spdq;
    private String sprq;
    private String spbm;
    private String spdj;
    private String spzyjg;
    private String sptp;
    private String spbz;
...}


public class spxxlbdto {
    private String spbm;
    private String splbbh;
...}

-----------------------------------------

执行代码:
   public void sptable(){
        //接着对数据库进行比对
        SqlSession session=sqlSessionFactory.openSession();
        spxxjk jk = session.getMapper(spxxjk.class);
        List x= new ArrayList();
        x= jk.spxxtable("*");
        session.commit();
        StringBuffer sb=new StringBuffer();
        String t=x.getClass().getName();
        System.out.println(t);
        System.out.println("已执行查询");
        System.out.println(x.toString());
        session.close();
    }

参考
MyBatis使用Collection查询多对多或一对多结果集bug
但是我已经排序了依然没能返回正确的结果。 麻烦大侠们帮助下。谢谢

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 18:07
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于在<result map="splbmap">...</result>元素中,您尝试将一个字符串类型的结果映射为一个List<spxxlbdto>类型的对象。这导致了一个问题,因为spxxlbdto类没有实现List接口。

    解决此问题的方法是将spxxlbdto类改为实现List接口,并确保它有相应的add()方法来添加到列表中。

    以下是修改后的代码:

    < resultMap id="spxxlist"type="com.dto.spxxdto">
        <result column="spdm" property="spdm"/>
        <!-- ... -->
    </resultMap>
    < resultMap id="splbmap" type="com.dto.spxxlbdto">
        <result column="splbbh" property="splbbh"/>
        <!-- ... -->
    </resultMap>
    
    <select id="spxxtable" parameterType="java.lang.String" resultMap="spxxlist">
        SELECT spxm.*
        FROM spxx JOIN spxxlb ON spxm.spbm = spxxlb.spbm
        ORDER BY spxm.spbm ASC
    </select>
    
    <select id="spxxlist" parameterType="java.lang.String" resultMap="spxxlist">
        SELECT spxm.*,
               SELECT *
                FROM spxx JOIN spxxlb ON spxm.spbm = spxxlb.spbm
                WHERE spxm.spbm = #{spbm}
                ORDER BY spxm.spbm ASC
        INTO @splb
        FOR UPDATE SKIP LOCKED
        WITH CHECK OPTION
        ;
    </select>
    
    <select id="spxxlist" parameterType="java.lang.String" resultMap="splbmap">
        SELECT spxm.spbm, @splb.spbm as splb_spbm
        FROM spxm INNER JOIN @splb on spxm.spbm = @splb.spbm
        ;
    </select>
    

    然后,在你的Java代码中,你可以这样处理:

    public class SpxXDto<T> implements Serializable {
        private String spmc;
        private List<SpxXLbdTo> splb;
    
        public void addSpxXLbd(SpxXLbdTo s) {
            if (splb == null) {
                splb = new ArrayList<>();
            }
    
            splb.add(s);
        }
    }
    

    在这个例子中,我们创建了一个名为SpxXDto的类,它实现了Serializable接口,这意味着它可以被序列化和反序列化。我们还定义了一个构造函数和一个addSpxXLbd()方法来添加SpxXLbdTo对象到Splb列表中。现在,当你调用spxxtable时,你应该能够正确地获取并处理多对多关系的数据。

    评论

报告相同问题?

悬赏问题

  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统
  • ¥100 rtmpose姿态评估
  • ¥15 通联支付网上收银统一下单接口