文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot+JPA 分页查询指定列并返回指定实体方式

2024-04-02 19:55

关注

SpringBoot JPA分页查询指定列并返回指定实体

用习惯Mybatis,没用过jpa 真是各种踩坑了

脑壳疼,一个分页弄老半天,原来就一句话的事情,唉

先来说说正常的JPA如何操作

实体类对应表来创建,举个例子


@Entity
@Table(name = "td_user")
public class TdUser extends BaseModel { 
    private static final long serialVersionUID = 8659266017517096998L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, name = "id", length = 10)
    private Long id;
 
    
    @Column(nullable = false, name = "partner_id", length = 11)
    private Integer partnerId;
 
    
    @Column(nullable = false, name = "username", length = 32, unique = true)
    private String username;
 
    
    @Column(name = "nickname", length = 64)
    private String nickname;
 
    
    @JsonIgnore
    @Column(nullable = false, name = "password", length = 16)
    private String password;
 
    

相对应的建立操作接口


@Repository
public interface TdUserRepository extends JpaRepository<TdUser, Long>, JpaSpecificationExecutor<TdUser> {
}

分页查询的时候只要一句话


// Partner partner  外部传入的分页信息
Page<TdUser> allPage = TdUserRepository.findAll(pageable);

但是有时候可能不需要返回所有字段,只要返回一部分而已,经过各种尝试,有一种最简单的方法

就是把想要返回的字段再构建成一个实体,实体的属性需要和数据库字段进行映射,然后单独写一个Repository就可以了

比如


@Entity
@Table(name = "td_user")
public class UserVO extends BaseModel { 
    private static final long serialVersionUID = 8659266017517096998L;
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(nullable = false, name = "id", length = 10)
    private Long id; 
 
    
    @Column(nullable = false, name = "username", length = 32, unique = true)
    private String username;  

    
@Repository
public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {
}

调用的时候


// Partner partner  外部传入的分页信息
Page<User> allPage = UserRepository.findAll(pageable);

我一开始也尝试过写sql,但是我发现返回数据会变成Page<Object[]>,经过json数列化以后数据会变成 [ ["1":"string"],...]这种样子而不是key-value的形式

改了n遍后发现这样是最简单的。。。

SpringBoot JPA实现自定义语句分页查询

例:

1.JPA持久层 InvoiceRepository.java


@Repository
public interface InvoiceRepository extends JpaRepository<Invoice, Integer> { 
    @Query(
      value =
          "SELECT * from invoice_apply where company_id=?1 and IF (?2 is null ,1=1,status = ?2)",
      countQuery =
          "select count(*) from invoice_apply where company_id=?1 and IF (?2 is null ,1=1,status = ?2)",
      nativeQuery = true)
  Page<Map> findInvoice(int companyID, String status, Pageable pageable);
}

2.服务层


@Override
  public Map findInvoice(int companyID, String status, Integer page, Integer pageSize) {
    Double amount = companyFinanceRepository.findDCompanyFinance(companyID);
    //分页查询
    Pageable pageable = PageRequest.of(page, pageSize, Sort.Direction.ASC, "id");
    Page<Map> invoiceList = invoiceRepository.findInvoice(companyID, status, pageable);
    //重组返回结果
    Map map = new HashMap();
    map.put("invoice_amount", amount);
    map.put("list", invoiceList.getContent());//数据列表
    map.put("total", invoiceList.getTotalElements());//记录总条数
    map.put("current_page", invoiceList.getNumber());//当前页码
    return map;
  }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯