多表查询并对查询结果进行分页

需求:有实体类UserInfo存储用户的信息,Confession存储表白墙的信息。在confession用字段userId存储用户的id,然后在表白墙页面展示表白内容时需要同时有发布该内容的用户姓名。

页面效果:

实体类UserInfo:

package com.zongmao.school.entity;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;

/**
 * @Author: ZongMao
 * @Date: 12:56 2020/2/16
 * @Description:
 * @Modified By:
 */

@Entity
public class UserInfo {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String account;
    private String password;
    private String email;
    private String sex;
    private String headImg;           /*用以存储头像存储的链接*/
    private String sign;              /*用户的个性签名*/
    private String changePwLink;     /*changePwLink指通过邮箱进行密码修改的链接*/
    private Integer studentId;         /*学号id*/
    private Integer dormitory;           /*寝室id*/

   //get和set方法省略

}

实体类Confession:

package com.zongmao.school.entity;

import javax.persistence.*;

/**
 * @Author: ZongMao
 * @Date: 13:03 2020/3/8
 * @Description:
 * @Modified By:
 */

@Entity
public class Confession {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private Integer userId;/*发布者id*/
    private String content;/*内容*/
    private String time;/*时间*/
    private String state;/*状态,用以判断是否匿名*/
//get和set省略
}

定义一个实体类ConfessionVo存放存储查询的结果:

package com.zongmao.school.VoEntity;

/**
 * @Author: ZongMao
 * @Date: 12:04 2020/3/10
 * @Description:
 * @Modified By:
 */
public class ConfessionVo {

    private Integer userId;/*发布者id*/
    private String content;/*内容*/
    private String time;/*时间*/
    private String state;/*状态,用以判断是否匿名*/
    private String account;/*发布者姓名*/

    public ConfessionVo(){

    }
    public ConfessionVo(Integer userId,String content,String time,String state,String account){
        this.userId = userId;
        this.content = content;
        this.time = time;
        this.state = state;
        this.account= account;
    }
//get和set省略
}

Dao层:此处需与ConfessionVo属性一一对应

/**
 * @Author: ZongMao
 * @Date: 13:12 2020/3/8
 * @Description:
 * @Modified By:
 */
public interface ConfessionRepositories extends JpaRepository<Confession,Integer> {
    @Query("select new com.zongmao.school.VoEntity.ConfessionVo(c.userId,c.content,c.time,c.state,u.account) from Confession c , UserInfo u where c.userId=u.id order by c.time desc")
    public List<ConfessionVo> listConfession();
}

service层:

List<ConfessionVo> confessionVos = confessionRepositories.listConfession();

此时已经可以查询出所有的信息。但是前端需要分页,每次只需要固定的条数,需求升级。

此时尝试了单表查询时的limit,无法实现,所以写一个方法对查询出来的list集合进行分页。

分页方法ListPage:

package com.zongmao.school.config;

import com.alipay.api.internal.parser.json.ObjectJsonParser;
import com.zongmao.school.VoEntity.ConfessionVo;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author: ZongMao
 * @Date: 14:31 2020/3/10
 * @Description:自定义List分页方法
 * list 需要分页的list
 * pageNum 页码
 * pageSize 每页需要多少数据
 * @Modified By:
 */
public class ListPage {
    public static <obj> List<obj> startPage(List<obj> list, Integer pageNum, Integer pageSize) {
        if (list == null) {
            return null;
        }
        if (list.size() == 0) {
            return null;
        }

        Integer count = list.size(); // 记录总数
        Integer pageCount = 0; // 页数
        if (count % pageSize == 0) {
            pageCount = count / pageSize;
        } else {
            pageCount = count / pageSize + 1;
        }

        int fromIndex = 0; // 开始索引
        int toIndex = 0; // 结束索引

        if (pageNum != pageCount) {
            fromIndex = (pageNum - 1) * pageSize;
            toIndex = fromIndex + pageSize;
        } else {
            fromIndex = (pageNum - 1) * pageSize;
            toIndex = count;
        }

        List<obj> pageList = list.subList(fromIndex, toIndex);

        return pageList;
    }
}

server层:

 List<ConfessionVo> confessionVos = confessionRepositories.listConfession();
 List<ConfessionVo> confessionPage = ListPage.startPage(confessionVos,1,needSize);

通过调整参数即可实现自定义分页。

如果有其他方法实现多表查询并分页这个功能,请大佬告知。主要是对jpa不懂。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
LambdaQueryWrapper 是 MyBatis-Plus 提供的一个查询构造器,可以方便地进行复杂的查询操作。对于多表分页查询,可以通过 LambdaQueryWrapper 的 join() 方法来实现。 下面是一个示例代码: ```java Page<Map<String, Object>> page = new Page<>(1, 10); // 第一页,每页10条记录 LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(User.class, info -> !"password".equals(info.getColumn())); queryWrapper.eq(User::getDeleted, false); // 查询未被删除的用户 queryWrapper.orderByDesc(User::getCreateTime); // 按创建时间倒序排列 queryWrapper.last("limit " + page.getOffset() + ", " + page.getSize()); // 分页查询 // 进行关联查询 queryWrapper.join(UserRole.class, UserRole::getUserId, User::getId) .join(Role.class, Role::getId, UserRole::getRoleId) .eq(Role::getCode, "admin"); // 查询角色为管理员的用户 List<Map<String, Object>> result = userMapper.selectMaps(queryWrapper); page.setRecords(result); ``` 上述代码中,通过 LambdaQueryWrapper 的 select() 方法来指定查询的字段,通过 eq() 方法来添加查询条件,通过 orderByDesc() 方法来排序,通过 last() 方法来添加分页查询条件。接着通过 join() 方法来进行关联查询,最后通过 selectMaps() 方法来查询结果并返回。 需要注意的是,分页查询需要计算出偏移量和查询条数,并将其作为 last() 方法的参数传入。此外,如果需要查询多个表的字段,可以通过 select() 方法的第一个参数来指定返回的类型,然后通过第二个参数来指定返回的字段,例如上述代码中的 "password" 字段被排除在查询结果之外。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值