我知道在spring引导中,在存储库中创建一个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
}发布于 2017-05-14 06:20:37
首先,您还没有在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);对于这些约定,您可以参考这个链接。
更新2
分支管理器的firstName和lastName搜索
Person findFirstByBranchManager_FirstNameAndBranchManager_LastName(String firstName, String lastName);更新3
正如阿伦·哈达德在注释中提到的那样,这种实践是不可扩展的。
作为一种选择,我给出了一种访问DB查询的替代方法。
您可以创建一个示例对象并将其传递给findAll(Example e)实现的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));这将返回所有的人,其教师的名字是Teacher Name。
作为C# EntityFramework的替代方案,您可以在Java中使用QueryDSL。
https://stackoverflow.com/questions/43960667
复制相似问题