import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.stereotype.Repository; import com.zwg.demo.model.MUser; @Repository //public interface UserRepository extends CrudRepository<User, Long> { public interface UserRepository extends PagingAndSortingRepository<MUser, Long> { /* 框架在進(jìn)行方法名解析時(shí),會(huì)先把方法名多余的前綴截取掉,比如 find、findBy、read、readBy、get、getBy,然后對(duì)剩下部分進(jìn)行解析。并且如果方法的最后一個(gè)參數(shù)是 Sort 或者 Pageable 類(lèi)型,也會(huì)提取相關(guān)的信息,以便按規(guī)則進(jìn)行排序或者分頁(yè)查詢。 在創(chuàng)建查詢時(shí),我們通過(guò)在方法名中使用屬性名稱來(lái)表達(dá),比如 findByUserAddressZip ()??蚣茉诮馕鲈摲椒〞r(shí),首先剔除 findBy,然后對(duì)剩下的屬性進(jìn)行解析,詳細(xì)規(guī)則如下(此處假設(shè)該方法針對(duì)的域?qū)ο鬄?AccountInfo 類(lèi)型): 先判斷 userAddressZip (根據(jù) POJO 規(guī)范,首字母變?yōu)樾?xiě),下同)是否為 AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒(méi)有該屬性,繼續(xù)第二步; 從右往左截取第一個(gè)大寫(xiě)字母開(kāi)頭的字符串(此處為 Zip),然后檢查剩下的字符串是否為 AccountInfo 的一個(gè)屬性,如果是,則表示根據(jù)該屬性進(jìn)行查詢;如果沒(méi)有該屬性,則重復(fù)第二步,繼續(xù)從右往左截??;最后假設(shè) user 為 AccountInfo 的一個(gè)屬性; 接著處理剩下部分( AddressZip ),先判斷 user 所對(duì)應(yīng)的類(lèi)型是否有 addressZip 屬性,如果有,則表示該方法最終是根據(jù) "AccountInfo.user.addressZip" 的取值進(jìn)行查詢;否則繼續(xù)按照步驟 2 的規(guī)則從右往左截取,最終表示根據(jù) "AccountInfo.user.address.zip" 的值進(jìn)行查詢。 在查詢時(shí),通常需要同時(shí)根據(jù)多個(gè)屬性進(jìn)行查詢,且查詢的條件也格式各樣(大于某個(gè)值、在某個(gè)范圍等等),Spring Data JPA 為此提供了一些表達(dá)條件查詢的關(guān)鍵字,大致如下: And --- 等價(jià)于 SQL 中的 and 關(guān)鍵字,比如 findByUsernameAndPassword(String user, Striang pwd); Or --- 等價(jià)于 SQL 中的 or 關(guān)鍵字,比如 findByUsernameOrAddress(String user, String addr); Between --- 等價(jià)于 SQL 中的 between 關(guān)鍵字,比如 findBySalaryBetween(int max, int min); LessThan --- 等價(jià)于 SQL 中的 "<",比如 findBySalaryLessThan(int max); GreaterThan --- 等價(jià)于 SQL 中的">",比如 findBySalaryGreaterThan(int min); IsNull --- 等價(jià)于 SQL 中的 "is null",比如 findByUsernameIsNull(); IsNotNull --- 等價(jià)于 SQL 中的 "is not null",比如 findByUsernameIsNotNull(); NotNull --- 與 IsNotNull 等價(jià); Like --- 等價(jià)于 SQL 中的 "like",比如 findByUsernameLike(String user); NotLike --- 等價(jià)于 SQL 中的 "not like",比如 findByUsernameNotLike(String user); OrderBy --- 等價(jià)于 SQL 中的 "order by",比如 findByUsernameOrderBySalaryAsc(String user); Not --- 等價(jià)于 SQL 中的 "! =",比如 findByUsernameNot(String user); In --- 等價(jià)于 SQL 中的 "in",比如 findByUsernameIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類(lèi)型,也可以是數(shù)組或者不定長(zhǎng)參數(shù); NotIn --- 等價(jià)于 SQL 中的 "not in",比如 findByUsernameNotIn(Collection<String> userList) ,方法的參數(shù)可以是 Collection 類(lèi)型,也可以是數(shù)組或者不定長(zhǎng)參數(shù); */ //根據(jù)方法名查詢 public MUser findByName(String name); //分頁(yè)排序查詢 page從0開(kāi)始 public Page<MUser> findByName(String name, Pageable pageable); //根據(jù)JPSQL查詢 //表名稱 必須使用類(lèi)名稱 sql語(yǔ)句結(jié)尾不能加 ;號(hào) //select 不能使用* //@Query("from MUser where email=:email") //@Query("select u from MUser u where u.email=:email") //public User getBySql(@Param("email")String email); //@Query(value="select new com.zwg.demo.model.MUser1(id,name) from MUser where email=?1") //public MUser1 getBySql(String email); @Query(value="select new com.zwg.demo.model.MUser(id,name) from MUser where email=?1") public MUser getBySql(String email); //根據(jù)自然的SQL查詢 //自然查詢語(yǔ)句 表面是數(shù)據(jù)的名字 可以使用 * //@Query(value="select * from user where email=:email",nativeQuery=true) //@Query(value="select id,name, "" as email,"" as password from user where email=?1",nativeQuery=true) //public User getBySql(@Param("email")String email); /* @NamedQuery(或 @NamedNativeQuery)定義好查詢語(yǔ)句,唯一要做的就是為該語(yǔ)句命名時(shí),需要滿足”DomainClass.methodName()”的命名規(guī)則。 */ //根據(jù)NamedQuery查詢 //public MUser getBySql(String email); }
聯(lián)表查詢多表數(shù)據(jù)
public class UserGroup implements Serializable {
private static final long serialVersionUID = -7367871287146067764L;
@Id
@GeneratedValue
private Integer id;
@Column(name = "group_name",length = 64)
private String groupName;
}
public class UserA implements Serializable {
private static final long serialVersionUID = -7367871287146067764L;
@Id
@GeneratedValue
private Integer id;
@Column(name = "last_name",length = 64)
private String lastName;
@Column(name = "first_name", length = 64)
private String firstName;
@Column(name = "group_id")
private int groupId;
}
public class UserB {
private UserA userA;
private UserGroup group;
}
public interface UserARepository extends PagingAndSortingRepository<UserA,Integer> {
//@Query(value = "select a from UserA a join UserGroup g on a.groupId=g.id where g.id=1")
@Query(value = "select a.* from User_A a join User_Group g on a.group_id=g.id where g.id=1",nativeQuery = true)
List<UserA> getUserInfo();
// @Query(value = "select a from UserA a , UserGroup g where a.groupId=g.id and g.id=1")
// List<UserA> getUserInfo();
@Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g where a.groupId=g.id and g.id=1")
List<UserB> getUserBInfo();
@Query(value = "select new com.sample.springbatch.model.UserB(a,g) from UserA a , UserGroup g where a.groupId=g.id and g.id=1")
Page<UserB> getUserBInfo(Pageable page);
}
出自:https://my.oschina.net/skyzwg/blog/1512340