參考別人代碼
實體類
@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