web-dev-qa-db-ja.com

複合PK(Hibernate JPA)を持つエンティティで「findBy」を使用する方法

私はブーツスプリングで学んでいます。

findByDate(int date);は、移動するまで機能していましたint Dateを内部クラスに追加します。

これで、新しいエントリを保存できますが、日付ごとに取得できません

何を変更する必要がありますか?

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

    public ExpirationDTO findByDate(int date);
}

そして

@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
}

この例外をスローします:

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

リポジトリでは、Longの代わりに埋め込みキークラスの名前を含める必要があります。これを試してください(テストされていません):

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

その後、findByIdはあなたのEmbeddedIdであり、Dateは埋め込み可能クラスの属性です。そしてもう1つ:埋め込みキーの一部のみを使用する場合、1つの結果しか期待できない...

28
Javasick

埋め込みキークラスの名前をリポジトリに含め、アンダースコア(_)も追加する必要があります

以下でテスト済み:

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