1

バックグラウンド

データテーブルitem

+---------+---------+--------+
|  field  |  type   | index  |
+---------+---------+--------+
| id_item | INT     | PK     |
| name    | VARCHAR | UNIQUE |
+---------+---------+--------+

ItemRepository.java

public interface ItemRepository extends CustomRepository<Item, Integer> {
    public Item getByName(String name); // because of the unique index
}

CustomRepository.java

@NoRepositoryBean
public interface CustomRepository<E, PK extends Serializable> extends PagingAndSortingRepository<E, PK>, JpaSpecificationExecutor<E> {
    // common methods
}

CustomRepositoryImpl.java

public class CustomRepositoryImpl<E, PK extends Serializable> extends SimpleJpaRepository<E, PK> implements CustomRepository<E, PK> {
    // common methods implementations
}

質問

ご覧のとおり、インターフェースの実装はありませんItemRepository。つまり、getByNameメソッドには署名だけがあり、どこにも実装されることはありません。しかし、それは機能します。どのように?

PS

懐疑論者の場合、Eclipseを使用して、Ctrl押し続けてgetByName署名の上にマウスを置くと、クリックしOpen ImplementationてもJAVAファイルはまったく開かれません。

4

1 に答える 1

3

Spring はリポジトリに AOP を使用し、Bean プロパティgetByXに一致するすべてのメソッドをインターセプトします。Xあなたの例では、ItemBean がnameプロパティを宣言しているため、Spring がそれをインターセプトします。

Spring Data JPAマニュアルのクエリ メソッドの定義を参照してください。

于 2012-09-21T07:43:18.277 に答える