關於jpa的連表複雜查詢

  • 使用@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;
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章