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即可