Repository
**Repository<T, ID> 接口 **
使用@EnableJpaRepositories注解,会让帮我们自动的的发现有对应的CrudRepository、PagingAndSortingRepository或者JpaRepository这些接口的扩展
- CrudRepository<T, ID>
- PagingAndSortingRepository<T, ID>
- JpaRepository<T, ID>
T为我们要指定的实体对象,ID的类型。
定义查询
- find…By… / read…By… / query…By… / get…By…
简单的查找 - count…By…
做计数的定义,返回一个count的值 - …OrderBy…[Asc / Desc]
查询返回有多个记录的,用OrderBy定义是按照是哪一个字段来做一个顺序或者降序的排列 - And / Or / IgnoreCase
多个条件下使用,与find…By… / read…By… / query…By… / get…By搭配 - Top / First / Distinct
分页查询
- PagingAndSortingRepository<T, ID>
- Pageable / Sort
排序Sort ,记录附页信息Pageable - Slice / Page
以一个例子来说明:
@Transactional//方法执行的时候开启一个事务
1.保存实体
Coffee latte = Coffee.builder().name("latte")
.price(Money.of(CurrencyUnit.of("CNY"), 30.0))
.build();
coffeeRepository.save(latte);
log.info("Coffee: {}", latte);
Coffee espresso = Coffee.builder().name("espresso")
.price(Money.of(CurrencyUnit.of("CNY"), 20.0))
.build();
coffeeRepository.save(espresso);
log.info("Coffee: {}", espresso);
CoffeeOrder order = CoffeeOrder.builder()
.customer("Li Lei")
.items(Collections.singletonList(espresso))
.state(OrderState.INIT)
.build();
orderRepository.save(order);
log.info("Order: {}", order);
order = CoffeeOrder.builder()
.customer("Li Lei")
.items(Arrays.asList(espresso, latte))
.state(OrderState.INIT)
.build();
orderRepository.save(order);
log.info("Order: {}", order);
2.定义的接口
@NoRepositoryBean
public interface BaseRepository<T, Long> extends PagingAndSortingRepository<T, Long> {
List<T> findTop3ByOrderByUpdateTimeDescIdAsc(); //按照UpdateTime做了降序的排序,按Id做了个升序的排序。
}
public interface CoffeeOrderRepository extends BaseRepository<CoffeeOrder, Long> {
List<CoffeeOrder> findByCustomerOrderById(String customer);
List<CoffeeOrder> findByItems_Name(String name);
}
public interface CoffeeRepository extends BaseRepository<Coffee, Long> {
}
3.查询实体
coffeeRepository
.findAll(Sort.by(Sort.Direction.DESC, "id"))
.forEach(c -> log.info("Loading {}", c));
List<CoffeeOrder> list = orderRepository.findTop3ByOrderByUpdateTimeDescIdAsc();
log.info("findTop3ByOrderByUpdateTimeDescIdAsc: {}", getJoinedOrderId(list));
list = orderRepository.findByCustomerOrderById("Li Lei");
log.info("findByCustomerOrderById: {}", getJoinedOrderId(list));
// 不开启事务会因为没Session而报LazyInitializationException
list.forEach(o -> {
log.info("Order {}", o.getId());
o.getItems().forEach(i -> log.info(" Item {}", i));
});
list = orderRepository.findByItems_Name("latte");
log.info("findByItems_Name: {}", getJoinedOrderId(list));