Spring PagingAndSortingRepository - 按名称查找
Spring PagingAndSortingRepository - find by name
问题: 我正在尝试仅将国家/地区名称为...假设爱尔兰的采购订单加载到网格中。问题是我真的不知道这是否可能。
到目前为止,我已经尝试将服务 class executeQueryFindAll()
中的方法更改为类似这样的方法。
private Page<PurchaseOrder> executeQueryFindAll(int page, int maxResults) {
final PageRequest pageRequest = new PageRequest(page, maxResults, sortByNameASC());
Page<PurchaseOrder> purchaseOrders = purchaseOrderRepository.findAll(pageRequest);
Page<PurchaseOrder> selectedPurchaseOrders = new Page<PurchaseOrder>(); //not possibile to instantiate as Page is abstract
for(PurchaseOrder next : purchaseOrders){
if(next.getCountry().getCountryname().toString().equals("Ireland"))
selectedPurchaseOrders.add(next); //thats lame because is not a LIST so it wont work
}
return selectedPurchaseOrders;
}
上述方法行不通,因为 Page 是抽象的 class,因此无法实例化。我可以循环但我不能做 selectedPurchaseOrders.add(next)
因为那不是列表。在调试模式下,我可以评估 next.getCountry().getCountryname().toString()
并获得国家名称,这就是我尝试比较字符串对象 .equals("Ireland"))
.
的原因
有什么建议吗?
型号
@Entity
@Table(name = "PURCHASEORDER",schema = "POTOOL")
public class PurchaseOrder {
@Id
@GeneratedValue
private int id;
//other PurchaseOrder properties
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "country_id")
private Country country;
//Getter and Setters
存储库
public interface PurchaseOrderRepository extends
PagingAndSortingRepository<PurchaseOrder, Integer> {
Page<PurchaseOrder> findByTowerLike(Pageable pageable, String name);
}
服务
@Service
@Transactional
public class PurchaseOrderService {
@Autowired
private PurchaseOrderRepository purchaseOrderRepository;
@Transactional(readOnly = true)
public PurchaseOrderListVO findAll(int page, int maxResults) {
Page<PurchaseOrder> result = executeQueryFindAll(page, maxResults);
if(shouldExecuteSameQueryInLastPage(page, result)){
int lastPage = result.getTotalPages() - 1;
result = executeQueryFindAll(lastPage, maxResults);
}
return buildResult(result);
}
private Page<PurchaseOrder> executeQueryFindAll(int page, int maxResults) {
final PageRequest pageRequest = new PageRequest(page, maxResults, sortByNameASC());
return purchaseOrderRepository.findAll(pageRequest);
}
//rest of the class
您可以使用 PageImpl#getContent() 方法获取对象列表,这里是 PurchaseOrder,然后您可以遍历它并做任何您想做的事情。你需要这样的东西:
Page<PurchaseOrder> purchaseOrders = purchaseOrderRepository.findAll(pageRequest);
List<PurchaseOrder> selectedPurchaseOrders = new List<PurchaseOrder>();
for(PurchaseOrder next : purchaseOrders.getContent()){
if(next.getCountry().getCountryname().toString().equals("Ireland"))
selectedPurchaseOrders.add(next);
}
return selectedPurchaseOrders;
为什么要在内存中而不是在数据库中加载所有记录和筛选?
无论如何,由于这看起来像一个 Spring 数据项目,您应该真正阅读文档以了解可能的内容:
根据您是否需要分页,您需要在存储库端做的就是向您的 PurchaseOrderRepository
接口添加一个方法:
Page<PurchaseOrder> findByCountryCountryName(Pageable pageable, String name);
List<PurchaseOrder> findByCountryCountryName(String name);
不需要创建实现,因为 Spring Data 会执行此操作并根据方法名称创建查询。
The repository proxy has two ways to derive a store-specific query
from the method name. It can derive the query from the method name
directly, or by using a manually defined query.
然后您只需从服务层调用您的新方法:
@Service
@Transactional
public class PurchaseOrderService {
@Autowired
private PurchaseOrderRepository purchaseOrderRepository;
....
private List<PurchaseOrder> loadByCountry(String country) {
return purchaseOrderRepository.findByCountryCountryName(country);
}
}
问题: 我正在尝试仅将国家/地区名称为...假设爱尔兰的采购订单加载到网格中。问题是我真的不知道这是否可能。
到目前为止,我已经尝试将服务 class executeQueryFindAll()
中的方法更改为类似这样的方法。
private Page<PurchaseOrder> executeQueryFindAll(int page, int maxResults) {
final PageRequest pageRequest = new PageRequest(page, maxResults, sortByNameASC());
Page<PurchaseOrder> purchaseOrders = purchaseOrderRepository.findAll(pageRequest);
Page<PurchaseOrder> selectedPurchaseOrders = new Page<PurchaseOrder>(); //not possibile to instantiate as Page is abstract
for(PurchaseOrder next : purchaseOrders){
if(next.getCountry().getCountryname().toString().equals("Ireland"))
selectedPurchaseOrders.add(next); //thats lame because is not a LIST so it wont work
}
return selectedPurchaseOrders;
}
上述方法行不通,因为 Page 是抽象的 class,因此无法实例化。我可以循环但我不能做 selectedPurchaseOrders.add(next)
因为那不是列表。在调试模式下,我可以评估 next.getCountry().getCountryname().toString()
并获得国家名称,这就是我尝试比较字符串对象 .equals("Ireland"))
.
有什么建议吗?
型号
@Entity
@Table(name = "PURCHASEORDER",schema = "POTOOL")
public class PurchaseOrder {
@Id
@GeneratedValue
private int id;
//other PurchaseOrder properties
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name = "country_id")
private Country country;
//Getter and Setters
存储库
public interface PurchaseOrderRepository extends
PagingAndSortingRepository<PurchaseOrder, Integer> {
Page<PurchaseOrder> findByTowerLike(Pageable pageable, String name);
}
服务
@Service
@Transactional
public class PurchaseOrderService {
@Autowired
private PurchaseOrderRepository purchaseOrderRepository;
@Transactional(readOnly = true)
public PurchaseOrderListVO findAll(int page, int maxResults) {
Page<PurchaseOrder> result = executeQueryFindAll(page, maxResults);
if(shouldExecuteSameQueryInLastPage(page, result)){
int lastPage = result.getTotalPages() - 1;
result = executeQueryFindAll(lastPage, maxResults);
}
return buildResult(result);
}
private Page<PurchaseOrder> executeQueryFindAll(int page, int maxResults) {
final PageRequest pageRequest = new PageRequest(page, maxResults, sortByNameASC());
return purchaseOrderRepository.findAll(pageRequest);
}
//rest of the class
您可以使用 PageImpl#getContent() 方法获取对象列表,这里是 PurchaseOrder,然后您可以遍历它并做任何您想做的事情。你需要这样的东西:
Page<PurchaseOrder> purchaseOrders = purchaseOrderRepository.findAll(pageRequest);
List<PurchaseOrder> selectedPurchaseOrders = new List<PurchaseOrder>();
for(PurchaseOrder next : purchaseOrders.getContent()){
if(next.getCountry().getCountryname().toString().equals("Ireland"))
selectedPurchaseOrders.add(next);
}
return selectedPurchaseOrders;
为什么要在内存中而不是在数据库中加载所有记录和筛选?
无论如何,由于这看起来像一个 Spring 数据项目,您应该真正阅读文档以了解可能的内容:
根据您是否需要分页,您需要在存储库端做的就是向您的 PurchaseOrderRepository
接口添加一个方法:
Page<PurchaseOrder> findByCountryCountryName(Pageable pageable, String name);
List<PurchaseOrder> findByCountryCountryName(String name);
不需要创建实现,因为 Spring Data 会执行此操作并根据方法名称创建查询。
The repository proxy has two ways to derive a store-specific query from the method name. It can derive the query from the method name directly, or by using a manually defined query.
然后您只需从服务层调用您的新方法:
@Service
@Transactional
public class PurchaseOrderService {
@Autowired
private PurchaseOrderRepository purchaseOrderRepository;
....
private List<PurchaseOrder> loadByCountry(String country) {
return purchaseOrderRepository.findByCountryCountryName(country);
}
}