Spring PagingAndSortingRepository - 按名称查找

时间:2015-02-26 15:31:29

标签: hibernate spring-mvc spring-data

问题:我正在尝试仅将国家名称的采购订单加载到网格中...让我们说爱尔兰。事情是,我真的不知道这是否可能。 到目前为止,我已经尝试将服务类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是一个抽象类,因此无法实例化。我可以循环但我无法做selectedPurchaseOrders.add(next),因为那不是List。在调试模式下,我可以评估next.getCountry().getCountryname().toString(),我得到国家名称,这就是为什么我试图比较String对象.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 

2 个答案:

答案 0 :(得分:3)

为什么要加载所有记录并在内存中而不是在数据库中进行过滤?

无论如何,因为这看起来像一个Spring Data项目,你应该阅读文档以了解可能的内容:

http://docs.spring.io/spring-data/jpa/docs/1.8.0.M1/reference/html/#repositories.query-methods.query-creation

根据您是否需要分页,您需要在存储库端执行的操作是向PurchaseOrderRepository接口添加方法:

Page<PurchaseOrder> findByCountryCountryName(Pageable pageable, String name);

List<PurchaseOrder> findByCountryCountryName(String name);

不需要创建实现,因为Spring Data会执行此操作并根据方法名称创建查询。

  

存储库代理有两种方法可以派生特定于商店的查询   从方法名称。 它可以从方法名称派生查询   直接,或使用手动定义的查询。

然后,您只需要从服务层调用新方法:

@Service
@Transactional
public class PurchaseOrderService {

   @Autowired
   private PurchaseOrderRepository purchaseOrderRepository;

   ....

   private List<PurchaseOrder> loadByCountry(String country) {
      return purchaseOrderRepository.findByCountryCountryName(country);
   }
}

答案 1 :(得分:0)

您可以使用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;
相关问题