【问题标题】:How to shorten names of query methods in Spring Data JPA Repositories?如何缩短 Spring Data JPA 存储库中查询方法的名称?
【发布时间】:2015-07-13 04:56:29
【问题描述】:

考虑一个 Spring Data Jpa 存储库:

public interface UserRepository extends JpaRepository<User, Long> {

    User findOneByDeletedIsFalseAndActivationKey(String activationKey);

    List<User> findAllByDeletedIsFalseAndActivatedIsFalseAndCreatedDateBefore(DateTime dateTime);

    User findOneByDeletedIsFalseAndLogin(String login);

    User findOneByDeletedIsFalseAndEmail(String email);

}

请注意,每个方法中都有“DeletedIsFalse”。有没有一种简单的方法可以使方法名称更短?比如:

@FullMethodName("findOneByDeletedIsFalseAndEmail")
User findOneByEmail(String email);

【问题讨论】:

  • 当前SDR版本有没有更好的解决这个问题的办法?

标签: spring-data spring-data-jpa


【解决方案1】:

使用default Java 8 特性进行包装,就像这样:

// use findOneByEmail instead
User findOneByDeletedIsFalseAndEmail(String email);

default User findOneByEmail(String email) {
    return findOneByDeletedIsFalseAndEmail(email);
}

an example

【讨论】:

【解决方案2】:

现在您可以按照@Maksim Kostromin 的描述使用 Java 8 default 接口 methods。但是Spring中没有这样的功能。

-- 旧答案

没有这样的方法。您可以为方法指定任何名称并添加带有参数值的注释@Query,该参数值将所需的查询保存到数据库,如下所示:

@Query(value="select u from User u where u.deleted=false and u.email=:email")
User findOneByEmail(@Param("email")String email);

或者,使用原生 sql 查询:

@Query(value="SELECT * FROM users WHERE deleted=false AND email=?1", nativeQuery=true)
User findOneByEmail(String email);

您还可以使用遵循命名约定的名称进行查询,因为@Query 注释将优先于从方法名称进行的查询。

@Query docs

更新:

来自春天docs

虽然从方法名称派生查询非常方便,但可能会遇到这样的情况:方法名称会变得不必要地难看。因此,您可以通过命名约定使用 JPA 命名查询……或者使用 @Query 注释您的查询方法。

【讨论】:

    猜你喜欢
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2017-01-06
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    相关资源
    最近更新 更多