springboot中的命名存储库方法基于实体camelcase变量nam

时间:2017-05-14 05:26:50

标签: java spring spring-boot spring-data

我知道在spring boot中,在存储库中创建一个find方法将基于实体的变量名。如果我的实体中的变量是camel情况,我如何在存储库中创建一个find方法。这就是我创造的这个权利吗?

class Person { 
      private int id;  
      private Teacher teacher;  //other variable...getters and setters }
      private BranchManager branchManager;  //other variable...getters and setters }

class Teacher { 
      private String firstName ;  
      private String lastName;  //getters and setters }

class BranchManager { 
      private String firstName ;  
      private String lastName;  //getters and setters }

在我的资料库中

@Repository
public interface PersonRepository extends CrudRepository<Person, Long>{


      public Person findPersonByTeacherFirstName(String firstName);

      //how to find Person by BranchManager firstName and lastName

}

1 个答案:

答案 0 :(得分:0)

首先,您尚未在Teacher中声明Person个对象。假设您将声明如下

private Teacher teacher; // name of this object is important to create the repository methods

尝试

List<Person> findByTeacher_FirstName(String name);

请注意,findBy会返回一个列表。

如果您只想返回第一条记录。您可以使用以下

Person findFirstByTeacher_FirstName(String name);

另外,我个人更喜欢

Optional<Person> findFirstByTeacher_FirstName(String name);

因为这将返回Optional.empty()以防它找不到记录。此外,它将强制您检查其存在,从而避免NullPointerException。

更新1

根据评论的要求,
如果您想要通过firstName和lastName查找,可以使用以下

Person findFirstByTeacher_FirstNameAndTeacher_LastName(String firstName, String lastName);

您可以参考此link了解这些惯例。

更新2

按branchManager的firstName和lastName搜索

Person findFirstByBranchManager_FirstNameAndBranchManager_LastName(String firstName, String lastName);

更新3

正如Aluan Haddad在评论中所提到的,这种做法不具备可扩展性。

作为一种选择,我提供了另一种方法来查询数据库。
您可以创建一个示例对象,并将其传递给findAll(Example e)的{​​{1}}实现。

JpaRepository

现在使用

将此final Teacher exampleTeacher = new Teacher(); exampleTeacher.setName("Teacher Name"); final Person examplePerson = new Person(); example.setTeacher(exampleTeacher); 传递给examplePerson
Repository

这将返回所有教师姓名为List<Person> findAll(Example.of(examplePerson)); 的人。

作为C#EntityFramework的替代方案,您可以在Java中使用QueryDSL