【问题标题】:How to change method names from jpa-repository?如何从 jpa-repository 更改方法名称?
【发布时间】:2019-04-18 07:40:13
【问题描述】:

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

@Entity
@Getter
@Setter
@NoArgsConstructor
public class User{
  private int id;
  private String name;
  private String surname;
  private int age;
}

所以,我的存储库如下所示:

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

在我真正的产品代码中,参数太多,所以这个方法名太长而且不舒服。 有没有办法让长方法名称成为舒适的选项,比如 find ?

【问题讨论】:

  • 使用@Query 定义您自己的查询并为方法命名您想要的任何名称:baeldung.com/spring-data-jpa-query
  • 使用Criteria API 的查询来生成您的查询。方法名称和查询翻译只是简单的用例。

标签: spring spring-data-jpa repository


【解决方案1】:

使用 默认 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);
  }
}

你可以在这里找到完整的参考: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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2022-01-08
    • 2020-08-24
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多