使用Spring Data nad Querydsl,我们可以声明存储库接口并跳过实现类.一些具有特定名称或使用@Query注释的方法,这就是全部.
但是有时候我想使用JPAQuery并自己定义方法的主体,比方说
@Repository public class MyRepositoryImpl implements MyRepository { @PersistenceContext private EntityManager em; @Override public ListsomeMethod(String arg) { JPAQuery query = new JPAQuery(em); ... }
但这样我就必须实现其他MyRepository接口方法,这会破坏Spring Data的所有优点!
我可以看到两个选项:
为每个存储库声明另一个接口,然后通常实现它(接口数量增加一倍)
将EntityManager注入@Service类并在那里实现我的自定义方法
我更喜欢选项#2,但据我所知,在@Service类中我们应该只调用存储库方法,所以它也不是一个完美的解决方案.
那么程序员如何处理呢?
您不应该实现实际的Spring Data存储库,而是必须声明另一个自定义接口,您可以在其中放置自定义方法.
假设你有一个MyRepository
,定义为
@Repository public interface MyRepository extends JpaRepository{}
现在您要添加自定义findTuplesByMyArg()
,为了您的目的,您需要创建自定义存储库接口
public interface MyRepositoryCustom { ListfindTuplesByMyArg(String myArg); }
之后是自定义界面的实现
public class MyRepositoryImpl implements MyRepositoryCustom { @PersistenceContext private EntityManager em; @Override public ListfindTuplesByMyArg(String myArg) { JPAQuery query = new JPAQuery(em); ... } }
我们需要更改MyRepository
声明,因此它扩展了自定义存储库,以便
@Repository public interface MyRepository extends JpaRepository, MyRepositoryCustom {}
您可以findTuplesByMyArg()
通过注射轻松访问您MyRepository
,例如
@Service public class MyService { @Autowired private MyRepository myRepository; public ListretrieveTuples(String myArg) { return myRepository.findTuplesByMyArg(myArg); } }
注意名称在这里很重要(你需要Impl
在repo实现中默认配置postfix).
您可以在此处找到所有需要的信息