面向小白的SpringBoot的JPA的自定义Repository示例

268 阅读2分钟

这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

今天我们来兑现昨天的诺言,自定义个我们自己的Repository,因为在实际的业务中,框架给的不是足够满足我们需要的,因此我们需要自己造。

那怎么定义一个Repository呢?请听我慢慢道来。

定义Repository类

@NoRepositoryBean
public interface BaseRepository<T, Long> extends PagingAndSortingRepository<T, Long> {
  
}

之所以选择这个接口呢,就是因为这个接口不光有简单的crud,还有分页查询的方法。

然后,我们这个定义个方法: List findTop3ByOrderByUpdateTimeDescIdAsc();大家要注意这个方法一定要加By,否则就会报异常,这里我们是使用这个更新日期的倒排和这个iD的正排,选出数据。

搞代码

昨天的那个初始化代码我们就不重新写一遍了,主要是进行查询,我们可以调用原生的方法进行查询,然后根据id进行倒排,就像这样:

coffeeRepository
      .findAll(Sort.by(Sort.Direction.DESC, "id"))
      .forEach(c -> log.info("Loading {}", c));

我们一起看一下效果:

image.png

倒排完成。

接下来执行我们这个方法findTop3ByOrderByUpdateTimeDescIdAsc(),我问大家:方法执行的对不对,看什么?是不是看Sql啊。我们来看下执行Sql:就像这样:

image.png

结果是根据id正排,这里我只打印了id,并用逗号隔开。 image.png

我在映射的时候,使用了(Collectors.joining(",")这个方法,来完成的。

当然,我们还可能遇到用姓名来查找数据的情况,因此定义了这个方法: List findByCustomerOrderById(String customer);

Sql如下: image.png

结果如下:findByCustomerOrderById: 4,代码如下:

list = orderRepository.findByCustomerOrderById("冰墩墩");
log.info("findByCustomerOrderById: {}", getJoinedOrderId(list));

我们查了下冰墩墩的订单,当然你要是想查别人的也是可以的。

我们平时查数据库的时候使用的mybatis,感觉这个hibernate用的不是很习惯,你们在调用方法的时候需要添加事务注解,如果不加的话,我们看看效果:

如果你不加这个注解,他告诉你no session。 image.png

解决的话就加个注解就行了。