基本查詢
基本查詢也分為兩種矩乐,一種是spring data默認(rèn)已經(jīng)實(shí)現(xiàn),一種是根據(jù)查詢的方法來(lái)自動(dòng)解析成SQL原押。
預(yù)先生成方法
spring data jpa 默認(rèn)預(yù)先生成了一些基本的CURD的方法哈恰,例如:增、刪臼氨、改等等
1 繼承JpaRepository
public interface UserRepository extends JpaRepository<User, Long> {
}
2 使用默認(rèn)方法
@Test
public void testBaseQuery() throws Exception {
User user=new User();
userRepository.findAll();
userRepository.findOne(1l);
userRepository.save(user);
userRepository.delete(user);
userRepository.count();
userRepository.exists(1l);
// ...
}
自定義簡(jiǎn)單查詢
自定義的簡(jiǎn)單查詢就是根據(jù)方法名來(lái)自動(dòng)生成SQL掺喻,主要的語(yǔ)法是findXXBy,readAXXBy,queryXXBy,countXXBy, getXXBy后面跟屬性名稱:
User findByUserName(String userName);
也使用一些加一些關(guān)鍵字And、 Or
User findByUserNameOrEmail(String username, String email);
修改储矩、刪除感耙、統(tǒng)計(jì)也是類似語(yǔ)法
Long deleteById(Long id);
Long countByUserName(String userName)
基本上SQL體系中的關(guān)鍵詞都可以使用,例如:LIKE持隧、 IgnoreCase即硼、 OrderBy。
List<User> findByEmailLike(String email);
User findByUserNameIgnoreCase(String userName);
List<User> findByUserNameOrderByEmailDesc(String email);
具體的關(guān)鍵字屡拨,使用方法和生產(chǎn)成SQL如下表所示
復(fù)雜查詢
在實(shí)際的開發(fā)中我們需要用到分頁(yè)只酥、刪選褥实、連表等查詢的時(shí)候就需要特殊的方法或者自定義SQL
分頁(yè)查詢
分頁(yè)查詢?cè)趯?shí)際使用中非常普遍了,spring data jpa已經(jīng)幫我們實(shí)現(xiàn)了分頁(yè)的功能层皱,在查詢的方法中性锭,需要傳入?yún)?shù)Pageable
,當(dāng)查詢中有多個(gè)參數(shù)的時(shí)候Pageable建議做為最后一個(gè)參數(shù)傳入
Page<User> findALL(Pageable pageable);
Page<User> findByUserName(String userName,Pageable pageable);
Pageable 是spring封裝的分頁(yè)實(shí)現(xiàn)類,使用的時(shí)候需要傳入頁(yè)數(shù)叫胖、每頁(yè)條數(shù)和排序規(guī)則
@Test
public void testPageQuery() throws Exception {
int page=1,size=10;
Sort sort = new Sort(Direction.DESC, "id");
Pageable pageable = new PageRequest(page, size, sort);
userRepository.findALL(pageable);
userRepository.findByUserName("testName", pageable);
}
限制查詢
有時(shí)候我們只需要查詢前N個(gè)元素草冈,或者支取前一個(gè)實(shí)體。
ser findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);
自定義SQL查詢
其實(shí)Spring data 覺大部分的SQL都可以根據(jù)方法名定義的方式來(lái)實(shí)現(xiàn)瓮增,但是由于某些原因我們想使用自定義的SQL來(lái)查詢怎棱,spring data也是完美支持的;在SQL的查詢方法上面使用@Query注解绷跑,如涉及到刪除和修改在需要加上@Modifying.也可以根據(jù)需要添加 @Transactional 對(duì)事物的支持拳恋,查詢超時(shí)的設(shè)置等
@Modifying
@Query("update User u set u.userName = ?1 where c.id = ?2")
int modifyByIdAndUserId(String userName, Long id);
@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteByUserId(Long id);
@Transactional(timeout = 10)
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);
多表查詢
多表查詢?cè)趕pring data jpa中有兩種實(shí)現(xiàn)方式,第一種是利用hibernate的級(jí)聯(lián)查詢來(lái)實(shí)現(xiàn)砸捏,第二種是創(chuàng)建一個(gè)結(jié)果集的接口來(lái)接收連表查詢后的結(jié)果谬运,這里主要第二種方式。
首先需要定義一個(gè)結(jié)果集的接口類垦藏。
public interface HotelSummary {
City getCity();
String getName();
Double getAverageRating();
default Integer getAverageRatingRounded() {
return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
}
}
查詢的方法返回類型設(shè)置為新創(chuàng)建的接口
@Query("select h.city as city, h.name as name, avg(r.rating) as averageRating "
- "from Hotel h left outer join h.reviews r where h.city = ?1 group by h")
Page<HotelSummary> findByCity(City city, Pageable pageable);
@Query("select h.name as name, avg(r.rating) as averageRating "
- "from Hotel h left outer join h.reviews r group by h")
Page<HotelSummary> findByCity(Pageable pageable);
使用
Page<HotelSummary> hotels = this.hotelRepository.findByCity(new PageRequest(0, 10, Direction.ASC, "name"));
for(HotelSummary summay:hotels){
System.out.println("Name" +summay.getName());
}
在運(yùn)行中Spring會(huì)給接口(HotelSummary)自動(dòng)生產(chǎn)一個(gè)代理類來(lái)接收返回的結(jié)果梆暖,代碼匯總使用getXX的形式來(lái)獲取