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