我知道在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
}
答案 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。