注解@Query進行手動分頁查詢並實現if條件查詢


參考別人代碼

實體類

@Entity
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable {
	private static final long serialVersionUID = 1L;
	@Id
	private int id;
	private Timestamp createtime;
	private String empImage;
	private String empName;
	private String empNum;
	private Timestamp lastupdatetime;
	private String status;
	......
}

Repository類
手寫語句,這樣的好處在於,全部自定義,功能強大,能想出什么強大的sql就能用到什么強大的功能。

(c.emp_num=?1 or ?1 is null)
這種是做個非空判斷,如果是空,就跳過這個條件,不執行。
@Repository
public interface EmployeeRepositrory extends JpaRepository<Employee, Integer> {
	@Query(value ="select * from employee c "
			+ "where (c.emp_num=?1 or ?1 is null) and (c.status=?2 or ?2 is null) "
			+ "order by c.lastupdatetime desc  limit ?3,?4 ",nativeQuery = true)
	List<Employee> findAllList(String empNum,String status,Integer pageNumber,Integer pageSize);
	
	@Query(value ="select count(*) from employee c "
			+ "where (c.emp_num=?1 or ?1 is null) and (c.status=?2 or ?2 is null) "
			+ "order by c.lastupdatetime desc ",nativeQuery = true)
	Integer countAllList(String empNum,String status);
}

Controller控制器

	@PostMapping("/list")
	public ApiReturnObject findAll(String empNum,String status, Integer pageNumber, Integer pageSize) {
			//檢查pageNumber, pageSize非空
			CheckUtils.checkPageNumberPageSize(pageNumber, pageSize);
			//獲取數據
			List<Employee> list=employeeRepositrory.findAllList(empNum, status,(pageNumber-1)*pageSize, pageSize);
			//獲取計數
		    Integer countNum=employeeRepositrory.countAllList(empNum, status);
		    //封裝返回
			return ApiReturnUtil.pageManual(pageNumber, pageSize, countNum, list);		
	}

(pageNumber-1)*pageSize, pageSize
這個是因為,mysql的limit x,y;x代表從第幾條數據開始,y代表獲取多少
所以從數學的角度來講,這里是(pageNumber-1)*pageSize代表第幾條數據開始。
例如一共12條紀錄,pageNumber=2,pageSize=10
(pageNumber-1)*pageSize, pageSize=10,10
代表從第10條開始,連續拿10條(09,1019)

如果不會Limit的,這里補充一下,Limit是mysql的語法select * from table limit m,n 其中m是指記錄開始的index,從0開始,表示第一條是指從第m+1條開始, 取n條。

參考文檔:
https://blog.csdn.net/moshowgame/article/details/80672617

自己實現的項目代碼

實體類

package com.bonc.vbap.domain;

import com.bonc.BaseDomain;
import com.bonc.security.domain.SecGroup;
import com.bonc.security.domain.SecOrg;
import com.bonc.security.domain.SecUser;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;

import javax.persistence.Cacheable;
import javax.persistence.ColumnResult;
import javax.persistence.ConstructorResult;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedNativeQueries;
import javax.persistence.NamedNativeQuery;
import javax.persistence.SqlResultSetMapping;
import javax.persistence.SqlResultSetMappings;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;

/**
 * 作品分享信息
 * 
 * @author zr
 *
 */
@NamedNativeQueries({
		@NamedNativeQuery(
				name="ResultInfo.findToBeSharedResultInfoList",
				resultClass = ResultInfo.class,
				query = "select " +
						"r.display_name displayName," +
						"result.id resultId," +
						"result.created_date resultCreateDate," +
						"creatUserTwo.display_name resultCreatedByDisplayName" +
						" from VBAP3_RESULT_INFO r " +
						"left join VBAP3_SEC_USER secUser on r.sec_user_id=secUser.id " +
						"left join VBAP3_SEC_USER creatUserOne on r.created_by_id=creatUserOne.id " +
						"left join vbap3_result result on r.RESULT_ID=result.id " +
						"left join VBAP3_SEC_USER creatUserTwo on result.created_by_id=creatUserTwo.id " +
						"left join VBAP3_CATEGORY category on r.CATEGORY_ID=category.id " +
						"where secUser.id<>:secUserId " +
						"and creatUserOne.id<>:createdById " +
						"and r.creator=:creator " +
						"and if(IFNULL(:displayName,'')!='',r.display_name like :displayName,1=1) " +
						"and if(IFNULL(:categoryId,'')!='',category.id=:categoryId,1=1) " +
						"order by r.created_date desc " +
						"limit :pageNumber,:pageSize",
				resultSetMapping = "resultMapTwo"
		),
		@NamedNativeQuery(
				name="ResultInfo.findToBeSharedResultInfoListOther",
				resultClass = ResultInfo.class,
				query = "select " +
						"r.display_name displayName," +
						"result.id resultId," +
						"result.created_date resultCreateDate," +
						"creatUserTwo.display_name resultCreatedByDisplayName" +
						" from VBAP3_RESULT_INFO r " +
						"left join VBAP3_SEC_USER secUser on r.sec_user_id=secUser.id " +
						"left join VBAP3_SEC_USER creatUserOne on r.created_by_id=creatUserOne.id " +
						"left join vbap3_result result on r.RESULT_ID=result.id " +
						"left join VBAP3_SEC_USER creatUserTwo on result.created_by_id=creatUserTwo.id " +
						"left join VBAP3_CATEGORY category on r.CATEGORY_ID=category.id " +
						"where secUser.id<>:secUserId " +
						"and result.id not in :beSharedIdList " +
						"and creatUserOne.id<>:createdById " +
						"and r.creator=:creator " +
						"and if(IFNULL(:displayName,'')!='',r.display_name like :displayName,1=1) " +
						"and if(IFNULL(:categoryId,'')!='',category.id=:categoryId,1=1) " +
						"order by r.created_date desc " +
						"limit :pageNumber,:pageSize",
				resultSetMapping = "resultMapTwo"
		),
})
@SqlResultSetMappings({
		@SqlResultSetMapping(
				name = "resultMap",
				classes = @ConstructorResult(
						targetClass = ResultInfo.class,
						columns = {
								@ColumnResult(name = "categoryDisplayName", type = String.class),
								@ColumnResult(name = "categoryId", type = String.class),
								@ColumnResult(name = "categoryPath", type = String.class),
								//@ColumnResult(name = "resultContent", type = String.class),
								//@ColumnResult(name = "resulDisplayName", type = String.class),
								@ColumnResult(name = "resultId", type = String.class),
								@ColumnResult(name = "resultMemo", type = String.class),
								@ColumnResult(name = "resultPublish", type = Boolean.class),
								//@ColumnResult(name = "resultPublishContent", type = String.class),
								@ColumnResult(name = "resultState", type = Integer.class),
								@ColumnResult(name = "resultThumbnail", type = String.class),
								@ColumnResult(name = "resultType", type = String.class),
								@ColumnResult(name = "resultVersion", type = Integer.class),
								@ColumnResult(name = "creator", type = Boolean.class),
								@ColumnResult(name = "displayName", type = String.class),
								@ColumnResult(name = "id", type = String.class),
								@ColumnResult(name = "memo", type = String.class),
								@ColumnResult(name = "shareAuthority", type = String.class),
								@ColumnResult(name = "version", type = Integer.class),
								@ColumnResult(name = "publish", type = Boolean.class),
								@ColumnResult(name = "lastModifiedDate", type = Date.class),
								@ColumnResult(name = "userDisplayName", type = String.class),
						}
				)
		),
		@SqlResultSetMapping(
				name = "resultMapTwo",
				classes = @ConstructorResult(
						targetClass = ResultInfo.class,
						columns = {
								@ColumnResult(name = "displayName", type = String.class),
								@ColumnResult(name = "resultId", type = String.class),
								@ColumnResult(name = "resultCreateDate", type = Date.class),
								@ColumnResult(name = "resultCreatedByDisplayName", type = String.class),
						}
				)
		)
})
@Entity
@Cacheable
@Table(name = "VBAP3_RESULT_INFO")
public class ResultInfo extends BaseDomain implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/**
	 * 作品
	 */
	@ManyToOne
	@JoinColumn(name = "RESULT_ID")
	private Result result;
	/**
	 * 使用人
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "SEC_USER_ID")
	private SecUser secUser;
    /**
     * 使用組
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SEC_GROUP_ID")
    private SecGroup secGroup;
    /**
     * 使用組織機構
     */
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "SEC_ORG_ID")
    private SecOrg secOrg;
	/**
	 * 是否創建人
	 */
	private Boolean creator;
	/**
	 * 分享權限
	 */
	private String shareAuthority;

	@ManyToOne
	@JoinColumn(name = "CATEGORY_ID")
	private Category category;
	/**
     * 是否發布(0:未發布,1:已發布)
     */
    private Boolean publish;
	
    @Id
    @GeneratedValue(generator = "RESULT_INFO")
    @GenericGenerator(name = "RESULT_INFO", strategy = "com.bonc.SecTableGenerator", 
    parameters = {
    		@Parameter(name="table_name",value = "VBAP3_SYS_PK_GENERATOR"),
    		@Parameter(name="value_column_name",value = "VALUE_COLUMN_NAME"),
    		@Parameter(name="segment_column_name",value = "PK_COLUMN_NAME"),
    		@Parameter(name="segment_value",value = "ResultInfo_id"),
    		@Parameter(name="increment_size",value = "10"),
    		@Parameter(name="optimizer",value = "pooled-lo")
    })
    private String id;
    
	@Override
	public String getId() {
		return id;
	}

	@Override
	public void setId(String id) {
		this.id = id;
	}

	public Result getResult() {
		return result;
	}

	public void setResult(Result result) {
		this.result = result;
	}

	public SecUser getSecUser() {
		return secUser;
	}

	public void setSecUser(SecUser secUser) {
		this.secUser = secUser;
	}

	public SecGroup getSecGroup() {
        return secGroup;
    }

    public void setSecGroup(SecGroup secGroup) {
        this.secGroup = secGroup;
    }

    public SecOrg getSecOrg() {
        return secOrg;
    }

    public void setSecOrg(SecOrg secOrg) {
        this.secOrg = secOrg;
    }

    public Boolean getCreator() {
		return creator;
	}

	public void setCreator(Boolean creator) {
		this.creator = creator;
	}

	public String getShareAuthority() {
		return shareAuthority;
	}

	public void setShareAuthority(String shareAuthority) {
		this.shareAuthority = shareAuthority;
	}
	
	public Category getCategory() {
		return category;
	}

	public void setCategory(Category category) {
		this.category = category;
	}

	@Override
	public String toString() {
		return String.format("%s[%s,%nresult=%s,%nsecUser=%s,creator=%s,shareAuthority=%s,category=%s]",
				this.getClass().getSimpleName(), super.toString(), result.toString(), secUser.getUsername(),
				creator, shareAuthority, category == null ? "" : category.getDisplayName());
	}

    public Boolean getPublish() {
        return publish;
    }

    public void setPublish(Boolean publish) {
        this.publish = publish;
    }

	public ResultInfo() {
	}

	public ResultInfo(Category category,Result result,String displayName) {
		this.category=category;
		this.result = result;
		this.setDisplayName(displayName);
	}

	public ResultInfo(CategoryType categoryType,String categoryDisplayName,String categoryId,String categoryPath,
	String resultContent,String resulDisplayName,String resultId,String resultMemo,Boolean resultPublish,String resultPublishContent,Integer resultState,String resultThumbnail,String resultType,Integer resultVersion,
					  Boolean creator,String displayName,String id,String memo,String shareAuthority,Integer version) {
		Category category = new Category();
		category.setCategoryType(categoryType);
		category.setDisplayName(categoryDisplayName);
		category.setId(categoryId);
		category.setPath(categoryPath);

		Result result = new Result();
		result.setContent(resultContent);
		result.setDisplayName(resulDisplayName);
		result.setId(resultId);
		result.setMemo(resultMemo);
		result.setPublish(resultPublish);
		result.setPublishContent(resultPublishContent);
		result.setState(resultState);
		result.setThumbnail(resultThumbnail);
		result.setType(resultType);
		result.setVersion(resultVersion);

		this.category= category;
		this.result=result;
		this.creator=creator;
		this.setDisplayName(displayName);
		this.id=id;
		this.setMemo(memo);
		this.shareAuthority=shareAuthority;
		this.setVersion(version);

	}

	public ResultInfo(String categoryDisplayName,String categoryId,String categoryPath,
					String resultId,String resultMemo,Boolean resultPublish,Integer resultState,String resultThumbnail,String resultType,Integer resultVersion,
					  Boolean creator,String displayName,String id,String memo,String shareAuthority,Integer version,Boolean publish,Date lastModifiedDate,
					  String userDisplayName) {
		Category category = new Category();
		category.setDisplayName(categoryDisplayName);
		category.setId(categoryId);
		category.setPath(categoryPath);

		Result result = new Result();
		//result.setContent(resultContent);
		//result.setDisplayName(resulDisplayName);
		result.setId(resultId);
		result.setMemo(resultMemo);
		result.setPublish(resultPublish);
		//result.setPublishContent(resultPublishContent);
		result.setState(resultState);
		result.setThumbnail(resultThumbnail);
		result.setType(resultType);
		result.setVersion(resultVersion);

		SecUser secUser=new SecUser();
		secUser.setDisplayName(userDisplayName);

		this.category= category;
		this.result=result;
		this.creator=creator;
		this.setDisplayName(displayName);
		this.id=id;
		this.setMemo(memo);
		this.shareAuthority=shareAuthority;
		this.setVersion(version);
		this.publish=publish;
		this.setLastModifiedDate(lastModifiedDate);
		this.setCreatedBy(secUser);
	}

	public ResultInfo(Boolean creator,String displayName,String id,String memo,String shareAuthority,Integer version) {

		this.creator=creator;
		this.setDisplayName(displayName);
		this.id=id;
		this.setMemo(memo);
		this.shareAuthority=shareAuthority;
		this.setVersion(version);

	}

	public ResultInfo(String resultId) {
		this.id = resultId;
	}

	public ResultInfo(String displayName,String resultId,Date resultCreateDate,String resultCreatedByDisplayName) {
		this.setDisplayName(displayName);
		Result result = new Result();
		result.setCreatedDate(resultCreateDate);
		SecUser secUser = new SecUser();
		secUser.setDisplayName(resultCreatedByDisplayName);
		result.setCreatedBy(secUser);
		result.setId(resultId);
		this.result=result;
	}
}

repository

package com.bonc.vbap.repository;

import com.bonc.vbap.domain.ResultInfo;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.TiJpaRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;

import java.util.List;

/**
 * 作品分享
 * @author zr
 *
 */
@RepositoryRestResource
public interface ResultInfoRepository
        extends TiJpaRepository<ResultInfo, String>, JpaSpecificationExecutor<ResultInfo> {

    @RestResource(exported = false)
    List<ResultInfo> findToBeSharedResultInfoList(@Param("secUserId") String secUserId,
                                                  @Param("createdById") String createdById,
                                                  @Param("creator") Boolean creator,
                                                  @Param("displayName")String displayName,
                                                  @Param("categoryId")String categoryId,
                                                  @Param("pageNumber") Integer pageNumber,
                                                  @Param("pageSize") Integer pageSize);

    @RestResource(exported = false)
    List<ResultInfo> findToBeSharedResultInfoListOther(@Param("beSharedIdList") List<String>beSharedIdList,
                                                       @Param("secUserId") String secUserId,
                                                       @Param("createdById") String createdById,
                                                       @Param("creator") Boolean creator,
                                                       @Param("displayName")String displayName,
                                                       @Param("categoryId")String categoryId,
                                                       @Param("pageNumber") Integer pageNumber,
                                                       @Param("pageSize") Integer pageSize);

    @RestResource(exported = false)
    @Query("select count(r.displayName) from ResultInfo r where r.secUser.id<>?1 and r.createdBy.id<>?2 and r.creator=?3")
    Integer findToBeSharedResultInfoPageTotal(String secUserId,String createdById,Boolean creator);

    @RestResource(exported = false)
    @Query("select count(r.displayName) from ResultInfo r where r.result.id not in ?1 and r.secUser.id<>?2 and r.createdBy.id<>?3 and r.creator=?4")
    Integer findToBeSharedResultInfoPageTotal(List<String>beSharedIdList,String secUserId,String createdById,Boolean creator);


}

controller

@RequestMapping(value = "/toBeShared/resultInfoes", method = RequestMethod.GET)
    @ResponseBody
    @Transactional
    public ResponseEntity<?> getToBeSharedResultInfoes(
            @RequestParam(value = "toBeSharedUserId") String toBeSharedUserId,
            @RequestParam(value = "categoryId", required = false) String categoryId,
            @RequestParam(value = "displayName", required = false) String displayName,
            @RequestParam(value = "pageNo", required = false, defaultValue = "0") int pageNo,
            @RequestParam(value = "pageSize", required = false, defaultValue = "10") int pageSize,
            @RequestParam(value = "sort", required = false, defaultValue = "lastModifiedDate,desc") String sortField) {

        int checkPageNo = QueryUtils.checkPageNo(pageNo);
        PageRequest pageable = new PageRequest(checkPageNo, pageSize, QueryUtils.getSort(sortField));
        
        List<String> beSharedIdList = resultInfoRepository.findResultIdBySecUserIdAndCreator(toBeSharedUserId, false);

        boolean flag= displayName != null && !displayName.equals("");
        if (flag) {
            displayName="%"+displayName+"%";
        }

        Integer toBeSharedResultInfoPageTotal=0;
        List<ResultInfo> resultInfoList=null;

        if (CollectionUtil.isNotEmpty(beSharedIdList)) {
            toBeSharedResultInfoPageTotal = resultInfoRepository.findToBeSharedResultInfoPageTotal(beSharedIdList,toBeSharedUserId, toBeSharedUserId, true);
            resultInfoList=resultInfoRepository.findToBeSharedResultInfoListOther(beSharedIdList,toBeSharedUserId,toBeSharedUserId,true,displayName,categoryId,checkPageNo,pageSize);

        }else{
            toBeSharedResultInfoPageTotal = resultInfoRepository.findToBeSharedResultInfoPageTotal(toBeSharedUserId, toBeSharedUserId, true);
            resultInfoList=resultInfoRepository.findToBeSharedResultInfoList(toBeSharedUserId,toBeSharedUserId,true,displayName,categoryId,checkPageNo,pageSize);
        }

        PageImpl<ResultInfo> page=new PageImpl<>(resultInfoList,pageable,toBeSharedResultInfoPageTotal);

        return ResponseEntity.ok().body(page);
    }

if條件查詢參考博客

https://www.cnblogs.com/laixin09/p/9776868.html

https://blog.csdn.net/liuming690452074/article/details/107671478


免責聲明!

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



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