2015-02-26 1 views
1

Problème: J'essaye de charger dans la grille seulement les ordres d'achat pour quel nom de pays est ... disons l'Irlande. La chose est que je ne sais pas vraiment si c'est possible. Jusqu'ici j'ai essayé de changer la méthode dans la classe de service executeQueryFindAll() à quelque chose comme ceci.Spring PagingAndSortingRepository - trouver par nom

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; 

} 

L'approche ci-dessus ne fonctionnera pas car Page est une classe abstraite, elle ne peut donc pas être instanciée. Je peux traverser mais je ne peux pas faire selectedPurchaseOrders.add(next) parce que ce n'est pas une liste. En mode débogage je peux évaluer le next.getCountry().getCountryname().toString() et j'obtiens le nom du pays et c'est pourquoi j'ai essayé de comparer l'objet String .equals("Ireland")).

Une suggestion?

Modèle

@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 

dépôt

public interface PurchaseOrderRepository extends 
    PagingAndSortingRepository<PurchaseOrder, Integer> { 

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

service

@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 

Répondre

3

Pourquoi voudriez-vous charger tous les enregistrements et filtrer en mémoire plutôt que dans la base de données?

Quoi qu'il en soit, comme cela ressemble à un projet de données de printemps, vous devriez vraiment lire la documentation pour voir ce qui est possible:

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

Selon si oui ou non vous avez besoin d'échange, tout ce que vous devez faire sur le côté référentiel est d'ajouter une méthode à votre interface PurchaseOrderRepository:

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

List<PurchaseOrder> findByCountryCountryName(String name); 

Il n'y a pas besoin de créer une mise en œuvre de données Spring va le faire et de créer une requête basée sur le nom de la méthode.

Le proxy de référentiel a deux façons de tirer une requête spécifique magasin du nom de la méthode. Il peut dériver la requête du nom de méthode directement ou en utilisant une requête définie manuellement.

Vous avez simplement besoin alors d'appeler votre nouvelle méthode de votre couche de service:

@Service 
@Transactional 
public class PurchaseOrderService { 

    @Autowired 
    private PurchaseOrderRepository purchaseOrderRepository; 

    .... 

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

Merci, je l'ai trié.Je connaissais la "Création de requêtes à partir des noms de méthodes" mais je ne savais pas qu'il était également possible de faire quelque chose comme findByCountryCountryName alors que Country est une entité séparée qui dans mon cas est mappée comme une relation ManytoOne dans la classe PurchaseOrder – user2342259

0

Vous pouvez utiliser PageImpl#getContent() méthode pour aller chercher la liste des objets, ici PurchaseOrder et puis vous pouvez itérer dessus et faire ce que vous voulez. Vous avez besoin de quelque chose comme ceci:

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; 
+0

Cela ne va pas travailler, j'ai aussi essayé de créer une liste d'objets purchaseOrder et boucle à travers mais le problème est quand je retourne l'objet. Je retourne une liste plutôt qu'une page que je ne peux pas lancer ... – user2342259