type parameter S is not within its bound i JPA Repository

0

Mam proste repository:

@Repository
public interface SearchRepository extends JpaRepository<Search, Long> {
}

do tego entity:

public class Search {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID")
    private Long id;

    @Column(name = "IS_ACTIVE")
    private Boolean isActive;

    @OneToMany(orphanRemoval = true, fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name = "SEARCH_ID")
    private List<Item> itemList;
}

Próbuję pobrać encję, zmienić jej wartość i zaktualizować w bazie:

    public void switchIsActive(Long id) {

        Optional<Search> search = searchRepository.findById(id);
        search.get().setIsActive(!search.get().getIsActive());
       searchRepository.save(search);
   }

Kompilator zgłasza mi jednak błąd w ostatniej linijce metody o treści:
Inferred type 'S' for type parameter 'S' is not within its bound; should extend 'app.entity.Search'

Za bardzo nie wiem o co chodzi :(

2

Bo probujesz zapisać Optionala a nie encję.
Zmień to


Optional<Search> search = searchRepository.findById(id);
        search.get().setIsActive(!search.get().getIsActive());

na takie coś

Search search = searchRepository.findById(id).get();
        search.setIsActive(!search.getIsActive());

Tak na marginesie po co używasz Optionala skoro i tak robisz get i dostaniesz Nullpointera jak nie znajdzie encji po id.

0

Wielkie dzięki, .get() uwolnił mnie od optionala

podroznik napisał(a):

Tak na marginesie po co używasz Optionala skoro i tak robisz get i dostaniesz Nullpointera jak nie znajdzie encji po id.

ponieważ nie umiałem pozbyć się optionala, miałem własne query które zwracało null w przypadku braku encji o danym id. teraz mogę to wyciąć i użyć interfejsowego findBy(id) :)

2
heretic napisał(a):

Wielkie dzięki, .get() uwolnił mnie od optionala

podroznik napisał(a):

Tak na marginesie po co używasz Optionala skoro i tak robisz get i dostaniesz Nullpointera jak nie znajdzie encji po id.

ponieważ nie umiałem pozbyć się optionala, miałem własne query które zwracało null w przypadku braku encji o danym id. teraz mogę to wyciąć i użyć interfejsowego findBy(id) :)

Jasne, ale to w takiej sytuacji lepiej użyć ifPresent zamiast get().

Czyli zrobiłbym coś takiego:


searchRepository.findById(id).ifPresent(search -> switchActive(search))

i switchActive to jest metoda ktora jako argument ma Twoją encję i tam wykonujesz update. Wtedy update wykona się tylko wtedy gdy zostanie znaleziona encja i nie dostaniesz wtedy chamskiego NullPointera.

1 użytkowników online, w tym zalogowanych: 0, gości: 1