web-dev-qa-db-ja.com

私のケースで結果をフィルタリングするカスタムCrudRepositoryメソッド(@Query)を記述する方法

私は、Spring JPAとリポジトリに関するものは初めてです。たくさんのフィールドが含まれるAuctionクラスがあり、フィールドの1つはカテゴリです。 CrudRepositoryのカスタムメソッドで結果をCategory.nameでフィルター処理したいのですが、

@XmlRootElement 
@Entity(name="AUCTION")
public class Auction implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    String id;

    @Column
    @Size(min=5, max=200)
    String title;

    String description;

    @OneToOne(cascade={CascadeType.ALL})
    Category category;

    ....}

カテゴリー

@Entity(name="CATEGORY")
//@NamedQuery(name="Category.findByName", query="select c from Category c where c.name=:name")
public class Category implements Serializable{

    private static final long serialVersionUID = 3L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String name;

    public Category()
    {

    }

オークションリポジトリで、次のようなメソッドを追加しました

@Repository
public interface AuctionRepository extends CrudRepository<Auction, String>{

    @Query("from Auction a join a.category c where c.name=:categoryName")
    public Iterable<Auction> findByCategory(String categoryName);

}

エラーをスローします。この方法を省略すると、すべてが正常に動作します。このタイプのカスタムメソッドはCrudRepositoryで宣言でき、SpringはmethodNameと指定したクエリヒントを使用して適切な処理を行うと誰かが言った。誰かが私を正しい方向に向けることができますか?.

7
Rajan

クエリで参照できるように、@Paramアノテーションをメソッド変数名に追加する必要があります。あなたが書いたコードは全く問題ありません。 EntityManagerへのアクセスが必要な場合は、カスタムリポジトリが必要になります。

@Query("from Auction a join a.category c where c.name=:categoryName")
public Iterable<Auction> findByCategory(@Param("categoryName") String categoryName);

Java 8を使用して@Paramでコンパイルする場合、-parametersは省略できます。

お役に立てば幸いです。

ヒント:質問を投稿するときは常に例外の詳細も投稿してください。問題の理解に役立ちます。

24
Nitin Arora