如何在Spring Data JPA Repositories中缩短查询方法的名称?

33

考虑一个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”。是否有简单的方法使方法名称更短?比如:

请注意,每个方法中都包含“DeletedIsFalse”一词。是否有一种简单的方式来缩短这些方法名呢?例如:

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

在当前的SDR版本中,这个问题有更好的解决方案吗? - Charlie
2个回答

60

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

interface UserInterface extends JpaRepository<User, Long> {

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

请查看这个示例

Kotlin中,你可以使用扩展函数,例如:

interface UserRepository : JpaRepository<User, Long> {

    // use findOneByEmail instead
    fun findOneByDeletedIsFalseAndEmail(email: String): User
}

fun UserRepository.findOneByEmail(email: String) =
    findOneByDeletedIsFalseAndEmail(email)

我需要启用某些功能才能使它工作吗?甚至在搜索中也找不到它。 - Shadov
@Shadov,你所说的“启用”是什么意思?你只需要Java 8,其中包含默认关键字功能:default returnType shortMethodName(args) { return longMethoName(args); } - Maksim Kostromin
是的,但出于某种原因它对我不起作用,不知道为什么,好像我的默认方法不在那里。想着可能需要启用某些东西。 - Shadov
请查看以下链接:https://github.com/daggerok/spring-data-examples/blob/master/shadov/src/main/java/daggerok/ShadovApplication.java。您可以克隆项目并在本地运行以验证是否工作正常(请参阅README: https://github.com/daggerok/spring-data-examples/blob/master/shadov/README.adoc)。 - Maksim Kostromin
7
如果我们想要更好的解决方案,我建议投票支持这个工单或者提出一个更好的功能请求。https://jira.spring.io/browse/DATACMNS-1213 - Snekse
显示剩余3条评论

13

现在您可以像Maksim Kostromin所描述的那样使用Java 8的default接口方法。但是在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);
< p>由于@Query注解优先于方法名称中的查询,因此您还可以使用符合查询命名约定的名称。

@Query文档

更新:

来自Spring文档:

尽管从方法名称派生查询相当方便,但可能会面临这样一种情况...... 方法名称会变得不必要地丑陋。 因此,您可以通过命名约定使用JPA命名查询......或者用@Query注释查询方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接