mybatis-puls 多表分页与数据表别名解决方案(自定义sql)

多表分页, photoType 我之前的参数是用Wrappers传入的使用上一样 就是ew.xxx 而已 具体看官网 多参数时建议使用,并且在实体字段上增加表名前缀

    @Select("select * from photo p LEFT JOIN label_detail ld on ld.PhotoID = p.PhotoID where p.PhotoType = ${photoType}")
    IPage<PhotoEntity> getPageBySort(IPage<PhotoEntity> page, @Param("photoType") Integer photoType);

这里的sql就基本与你手写一直,但是在生成sql 时page会被转换为sql,注意在排序oder序列中各个字段名称要写上面的命名 p、ld 或者 直接写表名,若直接写表名实体应该如下,在字段前跟上表名,这样生成时字段会加上前缀

@Data
@TableName("photo")
public class PhotoEntity extends Model<PhotoEntity> {

    @TableId(value = "photo.PhotoID",type = IdType.AUTO)
    private Integer photoId;
    
    @TableField("photo.PhotoName")
    private String photoName;

查询时字段如下

{
  "asc": [
    "p.FlowerNum"
  ],
  "current": 1,
  "desc": [
  ],
  "size": 10
}

当然你要是在实体里面写了前缀后应该

{
  "asc": [
    "photo.FlowerNum"
  ],
  "current": 1,
  "desc": [
  ],
  "size": 10
}

生成的sql

SELECT * FROM photo p LEFT JOIN label_detail ld ON ld.PhotoID = p.PhotoID WHERE p.PhotoType = 1 ORDER BY p.FlowerNum LIMIT 0,10
MyBatis-Plus 中,可以通过使用 @SqlResultSetMapping 注解和 @Query 注解来实现自定义返回对象的多表分页查询。 首先,需要使用 @SqlResultSetMapping 注解定义自定义返回对象。该注解的 name 属性指定了返回对象的名称,classes 属性指定了返回对象的属性。例如: ```java @SqlResultSetMapping(name = "UserAndOrderMapping", classes = { @ConstructorResult(targetClass = UserAndOrderDTO.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "name", type = String.class), @ColumnResult(name = "order_id", type = Long.class), @ColumnResult(name = "order_name", type = String.class) }) }) public class UserAndOrderDTO { private Long id; private String name; private Long orderId; private String orderName; public UserAndOrderDTO(Long id, String name, Long orderId, String orderName) { this.id = id; this.name = name; this.orderId = orderId; this.orderName = orderName; } // getters and setters } ``` 然后,在使用 @Query 注解时,需要指定 nativeQuery 属性为 true,表示使用原生 SQL 查询。同时,需要将 @SqlResultSetMapping 注解的 name 属性值作为 resultClass 属性的值传入 @Query 注解。例如: ```java @Query(value = "SELECT u.id, u.name, o.id AS order_id, o.name AS order_name FROM user u LEFT JOIN order o ON u.id = o.user_id", countQuery = "SELECT COUNT(*) FROM user u LEFT JOIN order o ON u.id = o.user_id", nativeQuery = true, resultSetMapping = "UserAndOrderMapping") Page<UserAndOrderDTO> selectUserAndOrderPage(Page page); ``` 这样就可以实现自定义返回对象的多表分页查询了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值