如何缩短Spring Data JPA存储库中查询方法的名称?

Igo*_*hin 20 spring-data spring-data-jpa

考虑一下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);

}
Run Code Online (Sandbox Code Playgroud)

请注意每个方法中都有" DeletedIsFalse".有一种简单的方法可以缩短方法名称吗?喜欢ie:

@FullMethodName("findOneByDeletedIsFalseAndEmail")
User findOneByEmail(String email);
Run Code Online (Sandbox Code Playgroud)

Mak*_*min 34

使用defaultJava 8功能进行包装,就像这样:

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

default User findOneByEmail(String email) {
    return findOneByDeletedIsFalseAndEmail(email);
}
Run Code Online (Sandbox Code Playgroud)

一个例子.

  • 如果我们想要一个更好的解决方案,我建议投票或提出更好的功能请求https://jira.spring.io/browse/DATACMNS-1213 (4认同)

Lia*_*Lia 8

现在您可以使用Java 8 default接口方法,如@Maksim Kostromin所述.但是春天没有这样的功能.

- 老答案

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

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

或者,使用本机SQL查询:

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

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

@Query docs

UPD:

来自Spring docs:

虽然获取从方法名称派生的查询非常方便,但是可能会面临这样的情况:方法名称会变得不必要地丑陋.因此,您可以通过命名约定使用JPA命名查询...或者使用@Query注释查询方法.