如何从 jpa-repository 更改方法名称?

Rob*_*rto 0 spring repository spring-data-jpa

spring+jpa(repositories) 实体有应用:

@Entity
@Getter
@Setter
@NoArgsConstructor
public class User{
  private int id;
  private String name;
  private String surname;
  private int age;
}
Run Code Online (Sandbox Code Playgroud)

因此,我的存储库如下所示:

@Repository
public interface UserRepository extends CrudRepository<User, Integer>{
  public List<User> findUsersByNameAndAge(String name, int age);
  public List<User> findUsersByNameAndSurname(String name, String surname);
}
Run Code Online (Sandbox Code Playgroud)

在我真正的生产代码中,参数太多,所以这个方法名太长而且不舒服。有没有办法从长方法名称中创建舒适的选项,例如仅查找?

小智 6

使用默认的Java 8 特性进行包装:

例如 :

   interface UserRepository extends JpaRepository<User, Long> {
  // don't use that crazy long method! use getByEmail instead
  User findFirstByEmailContainsIgnoreCaseAndField1NotNullAndField2NotNullAndField3NotNullAndField4NotNullAndField5NotNullAndField6NotNull(final String email);

  default User getByEmail(final String email) {
    return findFirstByEmailContainsIgnoreCaseAndField1NotNullAndField2NotNullAndField3NotNullAndField4NotNullAndField5NotNullAndField6NotNull(email);
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到完整的参考:https : //github.com/daggerok/spring-data-examples/blob/master/shadov/src/main/java/daggerok/ShadovApplication.java

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

@Query(value="select u from User u where u.deleted=false and u.email=:email")
User findOneByEmail(@Param("email")String email);
or, with native sql query:

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

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