- 使用@Subselect註解,將一個不可變(immutable)並且只讀的實體映射到一個數據庫的子查詢中。類似與創建一箇中間表
package com.touceng.uplus.entity;/**
* Created by tc_dev on 2018/11/23.
*/
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import org.hibernate.annotations.Immutable;
import org.hibernate.annotations.Subselect;
import org.hibernate.annotations.Synchronize;
import javax.persistence.*;
import java.util.Date;
/**
* @program: uplus
* @description: 用戶管理列表
* @author: yang.xu
* @create: 2018-11-23 14:07
**/
@Getter
@Setter
@Entity
@Immutable
@Table(name = "user_detail_list")
@Subselect("select s.id as user_id,s.user_code,s.name,case s.role_code when 'ROLE_P_USER' then '個人' when 'ROLE_E_USER' then '企業' end as role_code, " +
" case s.enabled when 1 then '啓用' when 0 then '禁用' end as status,s.username,s.create_time " +
" from sys_user s left join user_detail u on s.id = u.user_id ")
@Synchronize({"user_detail", "sys_user"})
public class UserDetailList {
@Id
@Column(name = "user_id", length = 64)
String userId;//用戶Id
@Column(name = "user_code", length = 30)
String userCode;//用戶編號
@Column(name = "name", length = 50)
String name; //用戶名稱
@Column(name = "role_code", length = 50)
String roleCode;//用戶類型
@Column(name = "status")
String status ;//啓用 禁用
@Column(name = "username", length = 40)
String username; //登陸賬號
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@Column(name = "create_time")
Date createTime; //創建時間
}
- jpa複雜條件查詢代碼書寫
/**
* @Description: 用戶信息搜索
* @Date: 2018/11/23
*/
@Override
public Page<UserDetailList> userInfoSearch(UserDetailSearchDto userDetailSearchDto) {
PageRequest pageRequest = new PageRequest(userDetailSearchDto.getPage(), userDetailSearchDto.getPageSize(), new Sort(userDetailSearchDto.getDirection(), userDetailSearchDto.getSort()));
Specification<UserDetailList> specification = new Specification<UserDetailList>() {
@Override
public Predicate toPredicate(Root<UserDetailList> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//我理解爲創建一個條件的集合
List<Predicate> predicates = new ArrayList<>();
//判斷傳過來的CityId是否爲null,如果不爲null就加到條件中
//
if (StringUtils.isNotBlank(userDetailSearchDto.getName())) {
predicates.add(cb.like(root.get("name").as(String.class), "%"+userDetailSearchDto.getName()+"%"));
}
if (StringUtils.isNotBlank(userDetailSearchDto.getUserCode())) {
predicates.add(cb.like(root.get("userCode").as(String.class),"%"+ userDetailSearchDto.getUserCode()+"%"));
}
if (StringUtils.isNotBlank(userDetailSearchDto.getRoleCode())) {
predicates.add(cb.equal(root.get("roleCode").as(String.class), userDetailSearchDto.getRoleCode()));
}else{
CriteriaBuilder.In<Object> in = cb.in(root.get("roleCode"));
in.value("個人");
in.value("企業");
predicates.add(in);
}
if (StringUtils.isNotBlank(userDetailSearchDto.getStatus())) {
predicates.add(cb.equal(root.get("status").as(String.class), userDetailSearchDto.getStatus()));
}
//創建一個條件的集合,長度爲上面滿足條件的個數
Predicate[] pre = new Predicate[predicates.size()];
//這句大概意思就是將上面拼接好的條件返回去
return query.where(predicates.toArray(pre)).getRestriction();
}
}; //這裏我們按照返回來的條件進行查詢,就能得到我們想要的結果
Page<UserDetailList> list = userDetailListDao.findAll(specification, pageRequest);
return list;
}