【问题标题】:Spring PagingAndSortingRepository - find by nameSpring PagingAndSortingRepository - 按名称查找
【发布时间】:2015-04-29 01:35:54
【问题描述】:

问题:我正在尝试仅将国家名称为的采购订单加载到网格中......假设是爱尔兰。问题是我真的不知道这是否可能。 到目前为止,我已经尝试将服务类 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),因为那不是列表。在调试模式下,我可以评估 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 

【问题讨论】:

    标签: hibernate spring-mvc spring-data


    【解决方案1】:

    您可以使用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;
    

    【讨论】:

    • 这行不通,我也尝试创建 PurchaseOrder 对象列表并循环,但问题是当我返回对象时。我返回一个 List 而不是一个 Page 我不能投...
    【解决方案2】:

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

    无论如何,由于这看起来像一个 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);
       }
    }
    

    【讨论】:

    • 谢谢,我已经整理好了。我知道“从方法名称创建查询”,但我不知道在 Country 是单独的实体时也可以执行 findByCountryCountryName 之类的操作,在我的情况下,该实体在 PurchaseOrder 类中映射为 ManytoOne 关系
    猜你喜欢
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多