1. 程式人生 > >spring boot jpa之 流式查詢 @Query定義查詢方法

spring boot jpa之 流式查詢 @Query定義查詢方法

按照方法名來定義查詢方法的形式,只適用於單表的一兩個欄位,那種複雜的查詢,還要自己寫sql語句,也就是@Query定義查詢方法

@Query(value=" 這裡就是查詢語句")

@Query支援hql和原生sql兩種方式,預設是hql  ,hql就是語句中用的是實體名字和實體屬性,原生sql用的表名字和表字段, 

方法名字這裡可以自己定義

1、hql方式

注意 hql 方式不支援 select *        要想查詢全部欄位可以用 sellect  實體名   這裡省略了value  ,引數使用了佔位置符 ?1  代表第一個引數   ?2代表第二個

public interface UserRepository extends JpaRepository<User, Long> {

  @Query("select u from User u where u.emailAddress = ?1")
  User findByEmailAddress(String emailAddress);
}

 @Param 代替引數佔位符,   hql或者sql裡就用   :firstname替換      方法裡的引數順序可以打亂

 @Query("select u from User u where u.firstname = :firstname or u.lastname = :lastname")
  User findByLastnameOrFirstname(@Param("lastname") String lastname,
                                 @Param("firstname") String firstname);
}

 如果是更新或者刪除操作,方法上面要加@Modifying      預設開啟的事務只是可讀的,更新操作加入@Modifying 就會關閉可讀

@Modifying
@Query("update User u set u.firstname = ?1 where u.lastname = ?2")
int setFixedFirstnameFor(String firstname, String lastname);

 hql分頁,返回的page 裡面包含了總頁數  當前頁  pageSize等資訊 , pageable呼叫的時候  傳入PageRequest pageRequest = new PageRequest(pageNo,pageSize); 即可

@Query(value = "select u from  User u where u.name like  %?1% ")
 
Page<User> findUserLikeByPage(String name, Pageable page);

//返回值或者用list   Page裡包含了總條數  當前頁數等分頁資訊   list就是資料 不包含分頁資訊
@Query(value = "select u from  User u where u.name like  %?1% ")
 
list<User> findUserLikeByPage(String name, Pageable page);

hql排序  這種方式不支援同時排序和分頁

@Query(value = "select u from  User u")
List<User> findUserLikeBySort(Sort sort);

 排序  直接使用 order by

@Query("select e from ECardEntity e ORDER BY e.seqNum ASC")
Page<ECardEntity> findInOrders(Pageable pageable);

 分頁里加入排序

Sort sort = new Sort(Direction.ASC, "seqNum");
Pageable pageable = new PageRequest(pageNum, size, sort);

多欄位排序

Sort sort = new Sort(Sort.Direction.DESC, "name").and(new Sort(Sort.Direction.ASC, "rangeMileage"));

//按線路降序和里程升序排序  
Order nameOrder = new Order(Direction.DESC, "sname");
Order rangeOrder = new Order(Direction.ASC, "rangeMileage");
List<Order> orders = new ArrayList<Order>();    
orders.add(nameOrder);//先按線路降序
orders.add(rangeOrder);//再按里程升序
Sort sort2 = new Sort(orders);
Pageable pageable = new PageRequest(pageNum, size, sort2);
   

hql 模糊查詢   這裡的%%不用單引號,原生的sql需要單引號  例如 '%張三%'

@Query(value = "select u from SysUser u where u.username like %:skey% or u.nickname = %:skey%",
    countQuery = "select count(u) from SysUser u where u.username like %:skey% or u.nickname = %:skey%")
Page<SysUser> pageQuery(@Param("skey") String skey, Pageable pageable);

 2、原生sql方式

原生sql方式 不能和Pageable pageable 同時使用,要用自己的limit實現分頁,原生的方式就和sql語法完全一樣,使用的表名字 表字段

//nativeQuery = true 就代表使用原始 sql  原始sql支援select *  方法名字可以自定義
@Query(value = "select * from book b where b.name=?1", nativeQuery = true)
List<Book> findByName(String name);

使用分頁 limit  start  , length       開始位置,長度

模糊查詢     like  '%:descripe%' 會出現無法識別descripe  所以要寫成  like CONCAT('%',:descripe,'%')

判斷  if(表示式1,表示式2,表示式3)  如果1成立1 就採取2 否則採取3     \"\"  轉義字元代表空字串

@Query(value="select * from table_management r where r.table_attribute = :tableAttribute and r.descripe like CONCAT('%',:descripe,'%') and if(\"\" = :dbName,1=1,r.db_name = :dbName)  and if(\"\" = :tableName,1=1,r.table_name = :tableName)  limit :start, :len ",nativeQuery=true)
public List<TableManagement> findTableManagement(@Param("tableAttribute") Integer tableAttribute,@Param("dbName") String dbName,@Param("tableName") String tableName,@Param("descripe") String descripe,@Param("start")  Integer start,@Param("len")  Integer len);
	

排序,就直接使用order by即可