当前位置:  开发笔记 > 程序员 > 正文

使用Querydsl和Spring Data时的最佳实践

如何解决《使用Querydsl和SpringData时的最佳实践》经验,为你挑选了1个好方法。

使用Spring Data nad Querydsl,我们可以声明存储库接口并跳过实现类.一些具有特定名称或使用@Query注释的方法,这就是全部.

但是有时候我想使用JPAQuery并自己定义方法的主体,比方说

@Repository
public class MyRepositoryImpl implements MyRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List someMethod(String arg) {
        JPAQuery query = new JPAQuery(em);
        ...
    }

但这样我就必须实现其他MyRepository接口方法,这会破坏Spring Data的所有优点!

我可以看到两个选项:

为每个存储库声明另一个接口,然后通常实现它(接口数量增加一倍)

将EntityManager注入@Service类并在那里实现我的自定义方法

我更喜欢选项#2,但据我所知,在@Service类中我们应该只调用存储库方法,所以它也不是一个完美的解决方案.

那么程序员如何处理呢?



1> vtor..:

您不应该实现实际的Spring Data存储库,而是必须声明另一个自定义接口,您可以在其中放置自定义方法.

假设你有一个MyRepository,定义为

@Repository
public interface MyRepository extends JpaRepository {}

现在您要添加自定义findTuplesByMyArg(),为了您的目的,您需要创建自定义存储库接口

public interface MyRepositoryCustom {
   List findTuplesByMyArg(String myArg);
}

之后是自定义界面的实现

public class MyRepositoryImpl implements MyRepositoryCustom {
    @PersistenceContext
    private EntityManager em;

    @Override
    public List findTuplesByMyArg(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 List retrieveTuples(String myArg) { 
      return myRepository.findTuplesByMyArg(myArg);
   }
}

注意名称在这里很重要(你需要Impl在repo实现中默认配置postfix).

您可以在此处找到所有需要的信息

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有