目前,我正在学习Spring Data JPA,我发现我需要创建一个自定义接口来创建一个自定义方法。我想知道是否有人能解释为什么会这样。假设我有一个带有字段的实体User
:userId
和name
。另外,我还有UserRepository
:
public interface UserRepository extends JpaRepository<User, Long> {...}
我发现我需要创建一个新的接口-UserRepositoryCustom
,在那里我应该创建自定义的抽象方法。另外,在那之后,我发现我需要创建一个类UserRepositoryImpl
,它实现了UserRepositoryCustom
。让我们看看我所做的代码:
@Repository
public class UserRepositoryImpl implements UserRepositoryCustom{
@PersistenceContext
private EntityManager entityManager;
@Override
public List<User> findUserByName(String name) {
Query query = entityManager.createNativeQuery("SELECT em.* FROM User em " +
"WHERE em.name = ?1", User.class);
query.setParameter(1, name);
return query.getResultList();
}
}
你能解释一下为什么我需要UserRepositoryCustom
和UserRepositoryImpl
在前台,为什么我需要EntityManager
和@PersistenceContext
在上面吗?每一条信息对我来说都很重要,因为这样我就能提取出对我来说最重要的东西,那就是理解。
我在网上找到了这段代码,它运行得很好,但我需要理解它。
1条答案
按热度按时间zc0qhyus1#
您不需要*****来完成这个操作。直接等价的方法是
UserRepository
接口中的一个方法,定义为List<User> findByName(String name)
。您也可以使用JPA命名查询、@Query
注解等。附加接口和实现类的使用旨在用于高级用例,这些用例在Spring Data JPA基于方法名称、注解等为您生成的查询中(不容易)实现。它不适用于简单的用例,如您显示的查询。
我强烈建议您阅读完整的Spring Data JPA documentation。您会注意到您问题中的解决方案只是文档的一小部分,它清楚地表明这是一个逃生通道,而不是使用Spring Data JPA的主要方式。