2017-09-24 23 views
0

我想要获得所有报价(其中)OfferState等于ACTIVE - 是否可以使用Spring Data仅使用方法名称,或者我必须使用@Query带Enum的JpaRepository: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; 
    } 
} 

findAllByOfferState_ACTIVE错误?当我做GET时,然后在我的服务方法getAllByPage中抛出异常Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.util.NoSuchElementException] with root cause。我试过@Enumerated(EnumType.STRING),没有它,但仍然是一样的。

+0

不要忘了接受/给予好评的答案,帮助你... – Cepr0

回答

2

您可以创建一个默认的接口方法:

public interface OfferRepository extends JpaRepository<Offer, Long> { 

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

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

有趣 - 我没有意识到你可以使用默认方法在存储库 – farrellmr

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

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

} 
+0

好吧,我以为我可以在方法直接做名称而不使用额外参数 – user7337867

+0

@ user7337867如果您使用'@ Query'编写自定义查询,则可以执行此操作,但对于这种情况并非必需。 – Barath