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
}

问题

如您所见,没有实现 interface ItemRepository。这意味着,该getByName方法只有一个签名,永远不会在任何地方实现。但它有效。如何?

附言

对于持怀疑态度的人来说,使用 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 回答