2015-05-03 38 views
13

考虑一个春天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); 

} 

注意每一种方法在具有 “DeletedIsFalse”。有没有简单的方法来缩短方法名称?如:

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

在当前的SDR版本中,这个问题有更好的解决方案吗? –

回答

6

有没有这样的方式。您可以为方法指定任何名称和持有这样的数据库所需的查询参数值添加注释@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

UPD:

从春天 docs

虽然获得从方法名称派生查询比较方便,一个可能面临的情况是......的方法名字会变得不必要的丑陋。因此,您可以通过命名约定来使用JPA命名查询......或者使用@Query来注释您的查询方法。

16

使用default的Java 8的功能进行包装,就像这样:

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

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

an example

+0

我应该启用某些功能吗?甚至没有在我的“搜索”中找到它。 – Shadov

+0

@沙多夫,你是什么意思启用?所有你需要的是java 8,它包含了默认的关键字特性功能:'''''''''''returnType shortMethodName(args){return longMethoName(args); }' –

+0

是的,但由于某种原因,它不起作用,不知道为什么,这就像我的默认方法不存在。想想也许我需要启用一些东西。 – Shadov

相关问题