mybatis查询有关联关系并且有相同字段的两张表问题解决

正好遇到这样的问题,要更具外键查询出外键所在表数据。

解决办法:

1、直接通过设计表,外键名即为关联表的主键名而不是来年改革表的主键都为id,这样可以直接查询出。--------这是通常的关联办法,即两张表的主键名称不同

2、在两张表注解名称相同并且实体又没有设置这个外键字段而是以实体的情况下,关联实体主键字段不管怎么设置都无法得到主键,所关联的实体主键就是主表所在的主键值,所以需要使用另一个实体字段来转换这个关联表的主键。


第一种思路的通用的方法,而我正好遇到了第二种情况,不管我怎么样设置或者是用别名实在获取的都是主表的id。当然有更好思路的你可以帮我更好的解决就最好了。


代码:

Mapper.xml

   //表关联映射

   <resultMap id="stream" type="com.sohu.bms.model.content.Stream">
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="name" property="name" jdbcType="VARCHAR" />
        <result column="index" property="index" jdbcType="INTEGER" />
        <result column="template" property="template" javaType="int" jdbcType="INTEGER" />
        <result column="display" property="display"  jdbcType="BOOLEAN" />
        <association property="room" column="room_id" javaType="com.sohu.bms.model.room.Room" jdbcType="INTEGER" resultMap="room"/>
        <association property="tag" column="tag_id" javaType="com.sohu.bms.model.content.Tag" jdbcType="INTEGER" resultMap="tag"/>
    </resultMap>
    <resultMap id="BaseResultMap" type="com.sohu.bms.model.cooperation.AutoAlbumStream" >
        <id column="id" property="id" jdbcType="INTEGER" />
        <result column="album_id" property="album_id" jdbcType="VARCHAR" />
        <result column="album_type" property="album_type" jdbcType="INTEGER" />
       <!-- <result column="stream_id" property="stream_id" javaType="int" jdbcType="INTEGER" />-->
        <result column="begin_time" property="begin_time" javaType="java.util.Date" jdbcType="TIMESTAMP" />
        <result column="end_time" property="end_time" javaType="java.util.Date" jdbcType="TIMESTAMP" />
        <association property="stream" column="stream_id" javaType="com.sohu.bms.model.content.Stream" jdbcType="INTEGER" resultMap="stream"/>
    </resultMap>

    //查询方法

   <select id="getAutoalbumById" parameterType="java.lang.Integer" resultMap="BaseResultMap">
        select
        album.id,album.album_id,album.album_type,album.begin_time,album.end_time,album.stream_id as template
        from cooperation_auto_album album left outer join content_stream con on album.stream_id=con.id where album.id=#{id,jdbcType=INTEGER}
    </select>

实体

Stream.java

    private int id;
    private String name;//名称
    private Room room;
    private int index=1;//位置
    private int template=0;//模板
    private boolean display=true;//是否显示
    private Tag tag;


AutoAlbumStream.java

    private int id;
    private String album_id;
    private int album_type=0;
    private Stream stream;
    private Date begin_time;//开始抓取时间
    private Date end_time;//结束抓取时间


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis-Plus中实现两张的关联分页查询,可以通过以下步骤进行操作: 1. 首先,定义一个包含关联字段的主实体类。可以使用注解@TableField来解决关联分区名称不一致的问题。 2. 然后,使用MyBatis-Plus提供的Page对象来创建一个分页查询对象,并指定页码和每页显示的记录数。 3. 接下来,创建一个Wrapper对象用于设置查询条件。可以使用QueryWrapper来构建查询条件。 4. 在Wrapper对象中,使用eq方法设置关联字段查询条件。 5. 如果需要对结果进行排序,可以使用orderByDesc或orderByAsc方法来设置排序条件。 6. 使用selectPage方法进行分页查询,并获取查询结果的记录列。 7. 对于每条主记录,使用Lambda达式遍历结果列,创建一个新的Wrapper对象用于查询关联的数据。 8. 在关联的Wrapper对象中,使用eq方法设置关联字段查询条件。 9. 使用selectList方法查询关联的数据,并将结果存放到主实体类的某个字段中。 10. 最后,将处理后的主记录列收集起来,并返回给调用者。 以下是一个示例代码,演示了如何在MyBatis-Plus中实现两张的关联分页查询: ```java Page<Order> page = new Page<>(1, 10); Wrapper<Order> wrapper = new QueryWrapper<>(); wrapper.eq("o.user_id", userId); // 添加查询条件 wrapper.orderByDesc("o.create_time"); // 添加排序条件 List<Order> orders = orderMapper.selectPage(page, wrapper) .getRecords() .stream() .map(order -> { QueryWrapper<OrderItem> itemWrapper = new QueryWrapper<>(); itemWrapper.eq("order_id", order.getId()); List<OrderItem> items = orderItemMapper.selectList(itemWrapper); order.setOrderItems(items); return order; }) .collect(Collectors.toList()); ``` 在上述示例中,我们通过Page对象指定了查询的页码和每页显示的记录数。然后,使用QueryWrapper对象设置了查询条件和排序条件。最后,通过selectPage方法进行分页查询,并使用Lambda达式遍历查询结果,查询关联的数据并存放到主实体类的某个字段中。最终,将处理后的主记录列返回给调用者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值