[TOC]
# jpa
## 生成通用模板
實現自定義方法有兩種方法:
1. 根據衍生規則進行實現,此種情況簡單;
查詢方法衍生規則
http://docs.spring.io/spring-data/jpa/docs/1.10.1.RELEASE/reference/html/#repositories.query-methods.query-creation
2. 自己編寫接口 OrderRepositoryExt
- 在接口中添加自定義方法
- OrderRepository繼承此接口
- OrderRepositoryImpl 實現此接口,這個實現類命名規則是一定的,在OrderRepository的基礎上加Impl;spring基礎會探測到此種情況,注入OrderRepository就可以了

### OrderRepository
```
public interface OrderRepository extends PagingAndSortingRepository<OrderEntity, String>, QueryDslPredicateExecutor<OrderEntity>, OrderRepositoryExt {
/**
* 根據渠道號和訂單編號查詢訂單
*
* @param orderNo
* @param chanNo
* @return
*/
public OrderEntity findFirstByOrderNoAndChanNo(String orderNo, String chanNo);
}
```
### OrderRepositoryExt
```
public interface OrderRepositoryExt {
public OrderEntity findByOrderNo(String orderNo);
}
```
### OrderRepositoryImpl
```
public class OrderRepositoryImpl implements OrderRepositoryExt {
@Autowired
private OrderRepository orderRepository;
@Override
public OrderEntity findByOrderNo(String orderNo) {
QOrderEntity qOrderEntity = QOrderEntity.orderEntity;
Predicate predicate = qOrderEntity.orderNo.eq(orderNo);
return orderRepository.findOne(predicate);
}
}
```
### 使用方法
```
@RestController
@RequestMapping("/test")
public class OrderController {
private static Logger log = LoggerFactory.getLogger(OrderController.class);
@Autowired
private OrderRepository repository;
@RequestMapping("/orders")
public Object order() {
OrderEntity orderEntity = new OrderEntity();
orderEntity.setId(UUID.randomUUID().toString());
orderEntity.setAccountId("111");
orderEntity.setAmount(new BigDecimal(10));
orderEntity.setChanNo("1111");
orderEntity.setCreateAt(new Date());
orderEntity.setOrderNo(UUID.randomUUID().toString());
orderEntity.setOrderStatus("execed_success");
orderEntity.setOrderType("INVEST");
orderEntity.setProductId("2222");
orderEntity.setTransactTime(new Date());
orderEntity.setProductName("12312");
orderEntity.setUpdateAt(new Date());
repository.save(orderEntity);
log.info("save-{}", JSONUtil.toJson(repository.findFirstByOrderNoAndChanNo(orderEntity.getOrderNo(), orderEntity.getChanNo())));
orderEntity.setProductName("update");
repository.save(orderEntity);
log.info("update-{}", JSONUtil.toJson(repository.findByOrderNo(orderEntity.getOrderNo())));
log.info("all ={}", JSONUtil.toJson(repository.findAll()));
List<String> ids = new ArrayList<>();
ids.add("11111");
return null;
}
```