本文深入探讨了Java Persistence API (JPA) 中的Query By Example (QBE) 动态查询机制。QBE允许开发者通过实例化一个实体类并设置其属性来构建查询,从而实现灵活的数据过滤。通过这种方式,可以轻松地处理不同条件的查询需求,而无需编写复杂的 JPQL 或 Criteria 查询。文中将解释QBE的工作原理,并提供示例展示如何在实际应用中使用QBE进行动态查询。
public Map<String, Object> getAssetInventory(AssetInventoryDto dto, PageableDto pageableDto) {
Pageable pageable = PageRequest.of(pageableDto.getPage() - 1, pageableDto.getSize(), Sort.Direction.DESC,
"createTimestamp");
AssetInventoryModel assetInventoryModel = new AssetInventoryModel();
UserInfoDto userInfoDto = ((SpringSecureUserInfo) MineSecureUtility.currentUser()).getUserInfo();
assetInventoryModel.setCreateId(userInfoDto.getId());
//Sort.Order order = new Sort.Order(Sort.Direction.DESC, "").nullsFirst();//空值放前面
ExampleMatcher matcher = ExampleMatcher.matching().withIgnorePaths("inventoryLoss").withIgnorePaths("quantity")
.withIgnorePaths("inventoryProfit")// 忽略属性:是否关注。因为是基本类型,需要忽略掉
.withMatcher("inventoryRunningNum", GenericPropertyMatchers.contains())// 全部模糊查询,即%{inventoryRunningNum}%
.withMatcher("inventoryName", GenericPropertyMatchers.contains());
if (!VGUtility.isEmpty(dto.getInventoryRunningNum())) {
assetInventoryModel.setInventoryRunningNum(dto.getInventoryRunningNum());
}
if (!VGUtility.isEmpty(dto.getInventoryName())) {
assetInventoryModel.setInventoryName(dto.getInventoryName());
}
if (!VGUtility.isEmpty(dto.getInventoryStatusStr())) {
assetInventoryModel
.setInventoryStatus(INVENTORY_CHECK.values()[Integer.parseInt(dto.getInventoryStatusStr())]);
}
Example<AssetInventoryModel> example = Example.of(assetInventoryModel, matcher);
Page<AssetInventoryModel> list = assetInventoryDao.findAll(example, pageable);
List<AssetInventoryDto> dtolist = new ArrayList<AssetInventoryDto>();
list.getContent().stream().forEach(e -> {
dtolist.add(convertAssetInventoryModelToDto(e));
});
Map<String, java.lang.Object> map = new HashMap<String, java.lang.Object>();
long total = list.getTotalElements();
map.put("total", total);
map.put("rows", dtolist);
return map;
}