Spring Boot Jpa中的一些常用方法有哪些?

说明:在刚开始结束Spring Boot的时候,会感觉到一种莫名其妙的感觉。为什么我只需要继承Jpa就可以实现Dao层的简单查询?那有哪些是已经实现的?又有哪些是可以通过命名查询的?如果我想自定义查询我应该如何编写呢?下面就是一些常用到的查询方式,可以帮助你一一解决上述问题。


什么是Jpa?

SpringBoot为什么称它为微服务?我感觉就是因为它在项目初始化的时候相对于SSM更加的简介化,不仅仅省略了繁杂的各种XML而且推出更加简洁的yml。第二点就是当下讲的Jpa了。可以直接使用Jpa完成简单的查询,不需要各种映射文件,提高了开发效率。Jpa其实就是一套规范,底层进行了分装(简单的增删查改都已经实现了),供开发者直接调用。

基本的查询有哪些?

默认实现的接口

findAll:就是无条件的查询所有列表数据

List<OrderDetail> orderDetailList = orderDetailRepository.findAll();

save():将数据插入到数据库

orderMasterRepository.save(orderMaster);

saveAndFlush(T):保存与更新。

productCategoryRepository.saveAndFlush(productCategory);

findOne():由于版本的问题,现在这个接口的虽然可以调用,但是无法查询数据,会报错误,现在修改为findById(主键id)。它的主要功能就是根据主键id查询对象信息。

productCategoryRepository.findById(1).get();

deleteById(主键ID):根据主键id删除对象信息。

orderDetailRepository.deleteById("3333");

count():统计对象的记录条数(不怎么常用)

Long l = orderDetailRepository.count();

使用生成解析SQL的方式

自定义的简单查询就是根据方法名来自动生成SQL,主要的语法是findByxxx,readByxxx,queryByxxx,getByxxx后面跟属性名称(实体对对象里面的属性,开头字母大写):同时支持Andor等连接词当做条件的拼接。

查询的数据的方式比较多,可以根据具体语义选择不同的查询。下面演示根据订单id查询数据的所有方法。

orderDetailRepository.findByOrderId("123456");
orderDetailRepository.readByOrderId("123456");
orderDetailRepository.queryByOrderId("123456");
orderDetailRepository.getByOrderId("123456");

连接词的使用。这里是根据订单id或者商品id查找数据

orderDetailRepository.findByOrderIdOrProductId("123456","956434");

坑:在使用默认实现查询的时候有个函数叫 getOne(),这个函数获取到的是代理对象,因此里面可能有一些数据是完全获取不到的,很容易造成空指针异常

分页查询:

页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable
,当查询中有多个参数的时候Pageable建议做为最后一个参数传入。

Page<User> findALL(Pageable pageable);
public void testPageQuery() throws Exception {    
    int page=1,size=10;
    Sort sort = new Sort(Direction.DESC, "id");
    Pageable pageable = new PageRequest(page, size, sort);
    userRepository.findALL(pageable);
    userRepository.findByUserName("testName", pageable);
}

自定义SQL查询:

* 在SQL的查询方法上面使用@Query注解,
* 如涉及到删除和修改在需要加上@Modifying.
* 也可以根据需要添加 @Transactional 对事物的支持,查询超时的设置等
    @Transactional
    @Modifying
    @Query("update OrderDetail u set u.productName = ?1 where u.orderId = ?2")
    void updateByOrderId(String userName,String OrderId);
    @Transactional
    @Modifying
    @Query("delete from OrderDetail where orderId = ?1")
    void deleteByOrderId(String OrderId);

参考文章:https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=2247483697&idx=1&sn=4f0f120c9d5f6a880f0a40fb0e8f60b5&chksm=ebf6d94edc8150589a97aad7bc47d0e302a381b6ad56feb0df338095e44a57cd0227a80b8e47&scene=21#wechat_redirect

 


 

 

 

 

 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值