web-dev-qa-db-fra.com

Comment utiliser "findBy" dans une entité avec un PK composite (Hibernate JPA)

J'apprends avec bootspring.

findByDate(int date); fonctionnait jusqu'à ce que je déménage int Date dans la classe interne.

Maintenant, je peux enregistrer de nouvelles entrées mais je ne peux pas les récupérer par Date

Que dois-je changer?

@Transactional
public interface ExpirationDAO extends JpaRepository<ExpirationDTO, Long> {

    public ExpirationDTO findByDate(int date);
}

et

@Embeddable
    public static class IdKey implements Serializable{
        @NotNull
        int date;
        @ManyToOne
        ProductDTO product;

        public IdKey(){
        }
         //setters and getters
    }
    @EmbeddedId
    private IdKey id;
    @NotNull
    int units;

    public ExpirationDTO(){     
    }
       //setters and getters
}

lève cette exception:

org.springframework.data.mapping.PropertyReferenceException: No property date found for type ExpirationDTO!
18
dmorar

Vous devez inclure le nom de la classe de clé intégrée dans le référentiel au lieu de Long. Essayez celui-ci (non testé):

public interface ExpirationDAO extends JpaRepository<ExpirationDTO, IdKey> {
    public List<ExpirationDTO> findByIdDate(int date);
}

Là après findById est le vôtre EmbeddedId et Date est l'attribut de la classe intégrable. Et encore une chose: si vous n'utilisez qu'une partie de la clé intégrée, vous ne pouvez pas vous attendre à un seul résultat ...

28
Javasick

Vous devez inclure le nom de la classe de clé intégrée dans le référentiel et également ajouter un trait de soulignement (_)

Testé ci-dessous:

public interface ExpirationDAO extends JpaRepository<ExpirationDTO, IdKey> {
    public List<ExpirationDTO> findByIdKey_Date(Date date);
}
2
Alifia