2017-09-24 2 views
0

Je veux obtenir toutes les offres avec (où) OfferState est égal à ACTIVE - est-il possible d'utiliser Spring Data avec un seul nom de méthode ou je dois utiliser @Query?JpaRepository avec Enum: findAllByOfferState_ACTIVE. NoSuchElementException

@Repository 
public interface OfferRepository extends JpaRepository<Offer, Long> { 
    Page<Offer> findAllByOfferState_ACTIVE(Pageable pageable); 
} 

public enum OfferState { 
    ACTIVE, FINISHED 
} 

@Entity 
@Table(name = "OFFERS") 
@Getter 
@Setter 
@NoArgsConstructor 
@AllArgsConstructor 
public class Offer { 

    @Id 
    @GeneratedValue 
    private Long id; 

    [...] 

    @Enumerated(EnumType.STRING) 
    private OfferState offerState; 
} 

@Service 
public class OfferServiceImpl implements OfferService { 

    @Autowired 
    private OfferRepository offerRepository; 

    @Override 
    public Offer saveOffer(Offer offer) { 
     offer.setOfferState(OfferState.ACTIVE); 
     return offerRepository.save(offer); 
    } 

    @Override 
    public Page<Offer> getAllByPage(Pageable pageable) { 
     Page<Offer> allByOfferState_active = offerRepository.findAllByOfferStateACTIVE(pageable); 
     return allByOfferState_active; 
    } 
} 

Est-ce que findAllByOfferState_ACTIVE est incorrect? Quand je fais GET, alors dans ma méthode de service getAllByPage lève une exception Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException] with root cause.

J'ai essayé avec @Enumerated(EnumType.STRING) et sans elle, mais toujours la même chose.

+0

Ne pas oublier d'accepter/réponses Upvote que vous a aidé ... – Cepr0

Répondre

2

Vous pouvez créer une méthode d'interface par défaut:

public interface OfferRepository extends JpaRepository<Offer, Long> { 

    default List<Offer> findAllWhereOfferStateIsActive() { 
     return findByOfferState(OfferState.ACTIVE); 
    } 

    List<Offer> findByOfferState(OfferState state); 
} 
+0

Intéressant - Je n'ai pas réalisé que vous pourriez utiliser les méthodes par défaut dans les dépôts – farrellmr

1
public interface OfferRepository extends PagingAndSortingRepository<Offer, Long> { 

    Page<Offer> findByOfferState(OfferState state,Pageable pageable); 

} 
+0

Ok, je pensais que je pouvais le faire directement dans la méthode nom sans utiliser un paramètre supplémentaire – user7337867

+0

@ user7337867 vous pouvez le faire si vous écrivez une requête personnalisée en utilisant @ @ Query, mais pour ce cas, il n'est pas nécessaire. – Barath