我应该使用Java 8默认方法来手动实现Spring Data存储库方法吗?

莱昂·雷德利(Leon Radley):

使用新的Spring Data Evans版本时,很高兴能够使用Java 8附带的一些不错的东西。其中之一是接口中的默认实现。下面的存储库使用QueryDSL来确保查询类型的安全。

我的问题是,在我写这篇文章之前,我先UserRepositoryCustomfindByLogin另一个类使用了一个单独的接口模式,然后UserRepositoryImpl在该类中使用@PersistenceContext来获取当前值EntityManager

EntityManager我没课时如何获得可能吗

@Repository
public interface UserRepository extends JpaRepository<User, UUID> {

    final QUser qUser = QUser.user;

    // How do I get the entityManager since this is a interface, i cannot have any variables?
    //@PersistenceContext
    //EntityManager entityManager;

    public default Optional<User> findByLogin(String login) {
        JPAQuery query = new JPAQuery(entityManager);
        User user = query
                .from(qUser)
                .where(
                        qUser.deleter.isNull(),
                        qUser.locked.isFalse(),
                        qUser.login.equalsIgnoreCase(login)
                )
                .singleResult(qUser);

        return Optional.ofNullable(user);
    }
}
奥利弗·德罗博姆(Oliver Drotbohm):

默认方法仅应用于将调用委派给其他存储库方法。默认方法-根据定义-无法访问实例的任何状态(因为接口没有状态)。它们只能委托给其他接口方法或调用其他类的静态方法。

实际上,使用参考文档中描述的自定义实现是正确的方法。这是供参考的简短版本(如果其他人也想知道的话):

/**
 * Interface for methods you want to implement manually.
 */
interface UserRepositoryCustom {
  Optional<User> findByLogin(String login);
}

/**
 * Implementation of exactly these methods.
 */
class UserRepositoryImpl extends QueryDslRepositorySupport implements UserRepositoryCustom {

  private static final QUser USER = QUser.user;

  @Override
  public Optional<User> findByLogin(String login) {

    return Optional.ofNullable(
      from(USER).
      where(
        USER.deleter.isNull(),
        USER.locked.isFalse(), 
        USER.login.equalsIgnoreCase(login)).
      singleResult(USER));
  }
}

/**
 * The main repository interface extending the custom one so that the manually
 * implemented methods get "pulled" into the API.
 */
public interface UserRepository extends UserRepositoryCustom, 
  CrudRepository<User, Long> { … }

请注意,命名约定在这里很重要(但可以根据需要进行自定义)。通过扩展,QueryDslRepositorySupport您可以访问该from(…)方法,从而不必与EntityManager自己进行交互

或者,您可以从存储库外部UserRepository实现QueryDslPredicateExecutor并上交谓词,但这最终会导致需要使用Querydsl的客户端(这可能是不必要的),而且您不会获得OptionalOOTB 包装类型。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

有没有办法使用存储库而不应用库基类的方法吗?

我可以在一个Spring Data JPA存储库方法上结合@Query定义和规范吗?

我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?

我应该使用“ this”来调用类的属性,成员或方法吗?

我应该使用哪个Java验证库?

我应该选择哪种方法来测试我的Spring Batch Job?

Java JSlider:不推荐使用setLabelTable方法字典,我还应该使用什么?

在Java中使用非持久连接时,我应该调用HttpUrlConnection的disconnect()方法吗?

在docker中运行spring boot webapp时,我应该使用“ -server” java标志吗?

Java-我应该使用AtomicReferenceArray吗?

我可以在Spring Data JPA存储库方法中将@Query定义与规范结合吗?

我应该使用哪种HTTP方法来更新会话属性?

我应该使用JanusGraph作为主数据库来存储我的新项目的所有数据吗?

我们现在应该使用Java 8进行Android开发吗?

我应该使用静态类来存储数据吗?

我应该在v8 :: External中手动删除指针吗?

通过Doctrine中的DQL使用默认存储库查找方法还有其他好处吗?

我应该使用什么方法来解析bash中的csv文件

ReactJS:我应该使用哪种生命周期方法来检测道具的变化?

我需要手动退订吗?-角度8

我应该使用哪种方法来更改Gui的大小?

我应该使用类或实例方法来增加对象吗?

从Java手动使用@Transactional方法创建Spring @Service实例

我应该手动修补任何漏洞吗?

我应该依靠传统的方法来执行GET / POST请求或其他库吗(Android)

我应该对没有数据库操作的方法使用Meteor方法存根吗?

我应该在网站上使用 JavaScript 数组来存储数据库中的项目数据吗?

我应该使用 Get 方法来获取值还是应该直接使用字段?

我应该在 Java 中使用 ++x 而不是 x++ 作为方法参数吗?