本節主要介紹Repository Bean中方法定義規范。
1、方法不是隨便聲明,需要符合一定的規范。
2、按照Spring Data的規范,查詢方法以find|read|get開頭,涉及條件查詢時,條件的屬性用條件關鍵字連接,要注意的是:條件屬性需要首字母大寫。
3、Spring Data支持的關鍵字如下:
4、支持屬性的級聯查詢,若當前類有符合條件的屬性,則優先使用,而不使用級聯屬性。若想使用級聯屬性,則屬性之間用"_"連接。

1 package com.ntjr.springdata; 2 3 import java.util.Date; 4 5 import javax.persistence.CascadeType; 6 import javax.persistence.Column; 7 import javax.persistence.Entity; 8 import javax.persistence.GeneratedValue; 9 import javax.persistence.Id; 10 import javax.persistence.JoinColumn; 11 import javax.persistence.ManyToOne; 12 import javax.persistence.Table; 13 14 @Table(name = "JPA_PERSONS") 15 @Entity 16 public class Person { 17 18 private Integer id; 19 private String lastName; 20 private String email; 21 private Date birth; 22 private Address address; 23 private Integer addressId; 24 25 @GeneratedValue 26 @Id 27 public Integer getId() { 28 return id; 29 } 30 31 public void setId(Integer id) { 32 this.id = id; 33 } 34 35 public String getLastName() { 36 return lastName; 37 } 38 39 @Column(name = "LAST_NAME") 40 public void setLastName(String lastName) { 41 this.lastName = lastName; 42 } 43 44 public String getEmail() { 45 return email; 46 } 47 48 public void setEmail(String email) { 49 this.email = email; 50 } 51 52 public Date getBirth() { 53 return birth; 54 } 55 56 public void setBirth(Date birth) { 57 this.birth = birth; 58 } 59 60 @JoinColumn(name = "ADDRESS_ID") 61 @ManyToOne(cascade = { CascadeType.ALL }, targetEntity = Address.class) 62 public Address getAddress() { 63 return address; 64 } 65 66 public void setAddress(Address address) { 67 this.address = address; 68 } 69 70 71 public Integer getAddressId() { 72 return addressId; 73 } 74 75 public void setAddressId(Integer addressId) { 76 this.addressId = addressId; 77 } 78 79 @Override 80 public String toString() { 81 return "Person [id=" + id + ", lastName=" + lastName + ", email=" + email + ", birth=" + birth + "]"; 82 } 83 84 }

1 package com.ntjr.springdata; 2 3 import javax.persistence.Entity; 4 import javax.persistence.GeneratedValue; 5 import javax.persistence.Id; 6 import javax.persistence.Table; 7 8 @Table(name="JPA_ADDRESSES") 9 @Entity 10 public class Address { 11 12 private Integer id; 13 private String province; 14 private String city; 15 16 @GeneratedValue 17 @Id 18 public Integer getId() { 19 return id; 20 } 21 22 public void setId(Integer id) { 23 this.id = id; 24 } 25 26 public String getProvince() { 27 return province; 28 } 29 30 public void setProvince(String province) { 31 this.province = province; 32 } 33 34 public String getCity() { 35 return city; 36 } 37 38 public void setCity(String city) { 39 this.city = city; 40 } 41 42 }

1 package com.ntjr.springdata; 2 3 import java.util.Date; 4 import java.util.List; 5 6 import org.springframework.data.repository.RepositoryDefinition; 7 8 /** 9 * 10 * 1、實現Repository接口 2、通過注解的方式@RepositoryDefinition將一個bean定義為Repository接口 11 */ 12 @RepositoryDefinition(idClass = Integer.class, domainClass = Person.class) 13 public interface PersonRepsitory { 14 // 根據lastName獲取對應的person 15 Person getByLastName(String lastName); 16 17 // WHERE lastName like ?% AND id<? 18 List<Person> findByLastNameStartingWithAndIdLessThan(String lastName, Integer id); 19 20 // WHERE lastName Like %? And Id <? 21 List<Person> findByLastNameEndingWithAndIdLessThan(String lastName, Integer id); 22 23 // WHERE email IN(?,?,?) Or birth <? 24 List<Person> findByEmailInOrBirthLessThan(List<String> emails, Date birth); 25 26 // WHERE a.id >? 27 /** 28 * AddressId 優先查找Person類中的AddressId屬性,如果Person類中沒有,就查找Address類中的Id屬性 29 * 這樣容易出現問題,建議級聯查詢中,屬性之間使用"_"連接 30 * 31 */ 32 List<Person> findByAddressIdGreaterThan(Integer id); 33 34 // 這樣就很明確是進行級聯查詢,Address類中的ID屬性 35 List<Person> findByAddress_IdGreaterThan(Integer id); 36 }