这是我参与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));
我们一起看一下效果:
倒排完成。
接下来执行我们这个方法findTop3ByOrderByUpdateTimeDescIdAsc(),我问大家:方法执行的对不对,看什么?是不是看Sql啊。我们来看下执行Sql:就像这样:
结果是根据id正排,这里我只打印了id,并用逗号隔开。
我在映射的时候,使用了(Collectors.joining(",")这个方法,来完成的。
当然,我们还可能遇到用姓名来查找数据的情况,因此定义了这个方法: List findByCustomerOrderById(String customer);
Sql如下:
结果如下:findByCustomerOrderById: 4,代码如下:
list = orderRepository.findByCustomerOrderById("冰墩墩");
log.info("findByCustomerOrderById: {}", getJoinedOrderId(list));
我们查了下冰墩墩的订单,当然你要是想查别人的也是可以的。
我们平时查数据库的时候使用的mybatis,感觉这个hibernate用的不是很习惯,你们在调用方法的时候需要添加事务注解,如果不加的话,我们看看效果:
如果你不加这个注解,他告诉你no session。
解决的话就加个注解就行了。