spring data jpa 分頁查詢


法一(本地sql查詢,注意表名啥的都用數據庫中的名稱,適用於特定數據庫的查詢)

復制代碼
public interface UserRepository extends JpaRepository<User, Long> {

@Query(value = "SELECT * FROM USERS WHERE LASTNAME = ?1",
countQuery
= "SELECT count(*) FROM USERS WHERE LASTNAME = ?1",
nativeQuery
= true)
Page
<User> findByLastname(String lastname, Pageable pageable);
}

復制代碼

 

法二(jpa已經實現的分頁接口,適用於簡單的分頁查詢)

復制代碼
public interface PagingAndSortingRepository<T, ID extends Serializable>
  extends CrudRepository<T, ID> {

Iterable<T> findAll(Sort sort);

Page<T> findAll(Pageable pageable);
}

Accessing the second page of User by a page size of 20 you could simply do something like this:

PagingAndSortingRepository<User, Long> repository = // … get access to a bean
Page<User> users = repository.findAll(new PageRequest(1, 20));

復制代碼
復制代碼
User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

復制代碼

 

復制代碼
//service
 Sort sort = new Sort(Sort.Direction.DESC,"createTime"); //創建時間降序排序
 Pageable pageable = new PageRequest(pageNumber,pageSize,sort);
 this.depositRecordRepository.findAllByUserIdIn(userIds,pageable);

//repository
Page<DepositRecord> findAllByUserIdIn(List<Long> userIds,Pageable pageable);

復制代碼

 

 

法三(Query注解,hql語局,適用於查詢指定條件的數據)

 @Query(value = "select b.roomUid from RoomBoard b where b.userId=:userId and b.lastBoard=true order by  b.createTime desc")
    Page<String> findRoomUidsByUserIdPageable(@Param("userId") long userId, Pageable pageable);
Pageable pageable = new PageRequest(pageNumber,pageSize);
Page<String> page = this.roomBoardRepository.findRoomUidsByUserIdPageable(userId,pageable);
List<String> roomUids = page.getContent();

可以自定義整個實體(Page<User>),也可以查詢某幾個字段(Page<Object[]>),和原生sql幾乎一樣靈活。

 

法四(擴充findAll,適用於動態sql查詢)

public interface UserRepository extends JpaRepository<User, Long> {
Page</span>&lt;User&gt; findAll(Specification&lt;User&gt;<span style="color: #000000;"> spec, Pageable pageable);

} 

復制代碼
@Service
public class UserService {
@Autowired
</span><span style="color: #0000ff;">private</span><span style="color: #000000;"> UserRepository userRepository;

</span><span style="color: #0000ff;">public</span> Page&lt;User&gt;<span style="color: #000000;"> getUsersPage(PageParam pageParam, String nickName) {
    </span><span style="color: #008000;">//</span><span style="color: #008000;">規格定義</span>
    Specification&lt;User&gt; specification = <span style="color: #0000ff;">new</span> Specification&lt;User&gt;<span style="color: #000000;">() {

        </span><span style="color: #008000;">/**</span><span style="color: #008000;">
         * 構造斷言
         * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> root 實體對象引用
         * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> query 規則查詢對象
         * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> cb 規則構建對象
         * </span><span style="color: #808080;">@return</span><span style="color: #008000;"> 斷言
         </span><span style="color: #008000;">*/</span><span style="color: #000000;">
        @Override
        </span><span style="color: #0000ff;">public</span> Predicate toPredicate(Root&lt;User&gt; root, CriteriaQuery&lt;?&gt;<span style="color: #000000;"> query, CriteriaBuilder cb) {
            List</span>&lt;Predicate&gt; predicates = <span style="color: #0000ff;">new</span> ArrayList&lt;&gt;(); <span style="color: #008000;">//</span><span style="color: #008000;">所有的斷言</span>
            <span style="color: #0000ff;">if</span>(StringUtils.isNotBlank(nickName)){ <span style="color: #008000;">//</span><span style="color: #008000;">添加斷言</span>
                Predicate likeNickName = cb.like(root.get("nickName").as(String.<span style="color: #0000ff;">class</span>),nickName+"%"<span style="color: #000000;">);
                predicates.add(likeNickName);
            }
            </span><span style="color: #0000ff;">return</span> cb.and(predicates.toArray(<span style="color: #0000ff;">new</span> Predicate[0<span style="color: #000000;">]));
        }
    };
    </span><span style="color: #008000;">//</span><span style="color: #008000;">分頁信息</span>
    Pageable pageable = <span style="color: #0000ff;">new</span> PageRequest(pageParam.getPage()-1,pageParam.getLimit()); <span style="color: #008000;">//</span><span style="color: #008000;">頁碼:前端從1開始,jpa從0開始,做個轉換
    </span><span style="color: #008000;">//</span><span style="color: #008000;">查詢</span>
    <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span><span style="color: #000000;">.userRepository.findAll(specification,pageable);
}

}

復制代碼

 

法五(使用entityManager,適用於動態sql查詢)

復制代碼
@Service
@Transactional
public class IncomeService{
</span><span style="color: #008000;">/**</span><span style="color: #008000;">
 * 實體管理對象
 </span><span style="color: #008000;">*/</span><span style="color: #000000;">
@PersistenceContext</span><span style="color: #000000;">
EntityManager entityManager;

</span><span style="color: #0000ff;">public</span> Page&lt;IncomeDaily&gt;<span style="color: #000000;"> findIncomeDailysByPage(PageParam pageParam, String cpId, String appId, Date start, Date end, String sp) {
    StringBuilder countSelectSql </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder();
    countSelectSql.append(</span>"select count(*) from IncomeDaily po where 1=1 "<span style="color: #000000;">);

    StringBuilder selectSql </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder();
    selectSql.append(</span>"from IncomeDaily po where 1=1 "<span style="color: #000000;">);

    Map</span>&lt;String,Object&gt; params = <span style="color: #0000ff;">new</span> HashMap&lt;&gt;<span style="color: #000000;">();
    StringBuilder whereSql </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder();
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(StringUtils.isNotBlank(cpId)){
        whereSql.append(</span>" and cpId=:cpId "<span style="color: #000000;">);
        params.put(</span>"cpId"<span style="color: #000000;">,cpId);
    }
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(StringUtils.isNotBlank(appId)){
        whereSql.append(</span>" and appId=:appId "<span style="color: #000000;">);
        params.put(</span>"appId"<span style="color: #000000;">,appId);
    }
    </span><span style="color: #0000ff;">if</span><span style="color: #000000;">(StringUtils.isNotBlank(sp)){
        whereSql.append(</span>" and sp=:sp "<span style="color: #000000;">);
        params.put(</span>"sp"<span style="color: #000000;">,sp);
    }
    </span><span style="color: #0000ff;">if</span> (start == <span style="color: #0000ff;">null</span><span style="color: #000000;">)
    {
        start </span>= DateUtil.getStartOfDate(<span style="color: #0000ff;">new</span><span style="color: #000000;"> Date());
    }
    whereSql.append(</span>" and po.bizDate &gt;= :startTime"<span style="color: #000000;">);
    params.put(</span>"startTime"<span style="color: #000000;">, start);

    </span><span style="color: #0000ff;">if</span> (end != <span style="color: #0000ff;">null</span><span style="color: #000000;">)
    {
        whereSql.append(</span>" and po.bizDate &lt;= :endTime"<span style="color: #000000;">);
        params.put(</span>"endTime"<span style="color: #000000;">, end);
    }

    String countSql </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder().append(countSelectSql).append(whereSql).toString();
    Query countQuery </span>= <span style="color: #0000ff;">this</span>.entityManager.createQuery(countSql,Long.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setParameters(countQuery,params);
    Long count </span>=<span style="color: #000000;"> (Long) countQuery.getSingleResult();

    String querySql </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> StringBuilder().append(selectSql).append(whereSql).toString();
    Query query </span>= <span style="color: #0000ff;">this</span>.entityManager.createQuery(querySql,IncomeDaily.<span style="color: #0000ff;">class</span><span style="color: #000000;">);
    </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.setParameters(query,params);
    </span><span style="color: #0000ff;">if</span>(pageParam != <span style="color: #0000ff;">null</span>){ <span style="color: #008000;">//</span><span style="color: #008000;">分頁</span>

query.setFirstResult(pageParam.getStart());
query.setMaxResults(pageParam.getLength());
}

    List</span>&lt;IncomeDaily&gt; incomeDailyList =<span style="color: #000000;"> query.getResultList();
  </span><span style="color: #0000ff;">if</span>(pageParam != <span style="color: #0000ff;">null</span>) { <span style="color: #008000;">//</span><span style="color: #008000;">分頁</span>
        Pageable pageable = <span style="color: #0000ff;">new</span><span style="color: #000000;"> PageRequest(pageParam.getPage(), pageParam.getLength());
        Page</span>&lt;IncomeDaily&gt; incomeDailyPage = <span style="color: #0000ff;">new</span> PageImpl&lt;IncomeDaily&gt;<span style="color: #000000;">(incomeDailyList, pageable, count);
        </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> incomeDailyPage;
    }</span><span style="color: #0000ff;">else</span>{ <span style="color: #008000;">//</span><span style="color: #008000;">不分頁</span>
        <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">new</span> PageImpl&lt;IncomeDaily&gt;<span style="color: #000000;">(incomeDailyList);
    }
}

</span><span style="color: #008000;">/**</span><span style="color: #008000;">
 * 給hql參數設置值
 * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> query 查詢
 * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> params 參數
 </span><span style="color: #008000;">*/</span>
<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span> setParameters(Query query,Map&lt;String,Object&gt;<span style="color: #000000;"> params){
    </span><span style="color: #0000ff;">for</span>(Map.Entry&lt;String,Object&gt;<span style="color: #000000;"> entry:params.entrySet()){
        query.setParameter(entry.getKey(),entry.getValue());
    }
}<br>}</span></pre>
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM