JPA多表分页动态多条件查询

参考文章:

项目里面应用了jpa,开发一时爽,到多表联合查询的时候就比较悲剧了。结合上面的文章,自写sql进行查询。代码如下:

@Component
public class JoinQueryRepoImpl {

  @Autowired
  private EntityManager entityManager;
  /**
   * 客户和账户级联查询
   */
  public Page<TBizAcctPopup> findAcctPopup(AcctVo condition, Pageable pageable) {

    StringBuilder countSelectSql = new StringBuilder();
    countSelectSql.append(" SELECT    count(1)                     ");
    countSelectSql.append(" FROM                                   ");
    countSelectSql.append("     t_biz_acct m,                        ");
    countSelectSql.append("     t_biz_customer_info n                ");
    countSelectSql.append(" WHERE                                  ");
    countSelectSql.append("     m.cust_no = n.id                     ");

    StringBuilder selectSql = new StringBuilder();
    selectSql.append(" SELECT                                 ");
    selectSql.append("  m.*,                                 ");
    selectSql.append("  n.cert_no AS cust_cert_no,           ");
    selectSql.append("  n.cert_type AS cust_cert_type,       ");
    selectSql.append("  n.NAME AS cust_name,                 ");
    selectSql.append("  n.sex AS cust_sex,                   ");
    selectSql.append("  n.mobile AS cust_mobile,             ");
    selectSql.append("  n.phone AS cust_phone,               ");
    selectSql.append("  n.email AS cust_email,               ");
    selectSql.append("  n.type AS cust_type,                 ");
    selectSql.append("  n.STATUS AS cust_status              ");
    selectSql.append(" FROM                                   ");
    selectSql.append("  t_biz_acct m,                        ");
    selectSql.append("  t_biz_customer_info n                ");
    selectSql.append(" WHERE                                  ");
    selectSql.append("  m.cust_no = n.id                     ");

    Map<String, Object> params = new HashMap<>();
    StringBuilder whereSql = new StringBuilder();
    if (!ObjectUtils.isEmpty(condition.getAcctType())) {
      whereSql.append(" AND m.acct_type = :acctType ");
      params.put("acctType", condition.getAcctType());
    }
    if (!StringUtils.isEmpty(condition.getCustCertNo())) {
      whereSql.append(" AND n.cert_no = :custCertNo ");
      params.put("custCertNo", condition.getCustCertNo());
    }
    if (!StringUtils.isEmpty(condition.getCustName())) {
      whereSql.append(" AND n.name like :custName ");
      params.put("custName", condition.getCustName() + "%");
    }
    if (!StringUtils.isEmpty(condition.getCustMobile())) {
      whereSql.append(" AND n.mobile = :custMobile ");
      params.put("custMobile", condition.getCustMobile());
    }
    if (!ObjectUtils.isEmpty(condition.getStatsList())) {
      whereSql.append(" AND n.status in (:status) ");
      params.put("status", condition.getStatsList());
    }

    String orderSql = "  order by m.id asc ";

    String countSql = new StringBuilder().append(countSelectSql).append(whereSql).toString();
    Query countQuery = entityManager.createNativeQuery(countSql);

    for (Map.Entry<String, Object> entry : params.entrySet()) {
      countQuery.setParameter(entry.getKey(), entry.getValue());
    }
    BigInteger totalCount = (BigInteger) countQuery.getSingleResult();

    String querySql = new StringBuilder().append(selectSql).append(whereSql).append(orderSql).toString();

    // select s.*,c.* 这种,两个表有相同字段的,因为第二个表的对应字段会用第一个表的对应字段,数据信息不对。
    //Query query = this.entityManager.createNativeQuery(querySql,"StudentResults");
    Query query = this.entityManager.createNativeQuery(querySql, TBizAcctPopup.class);
    for (Map.Entry<String, Object> entry : params.entrySet()) {
      query.setParameter(entry.getKey(), entry.getValue());
    }
    query.setFirstResult((int) pageable.getOffset());
    query.setMaxResults(pageable.getPageSize());

    List<TBizAcctPopup> resultList = query.getResultList();
    Page<TBizAcctPopup> page = new PageImpl<>(resultList, pageable, totalCount.longValue());

    return page;
  }
}

//-----------------------------------
//定义返回的时候接数据的bean
@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TBizAcctPopup implements Serializable {

  private static final long serialVersionUID = -6712496907168087009L;

  @Id
  @Column(name = "id")
  private Long id;

  @Column(name = "cust_no", nullable = false)
  private Long custNo;

  @Column(name = "name", nullable = false)
  private String name;
  
  @Column(name = "available_balance", nullable = false, precision = 2)
  private BigDecimal availableBalance;

  @Column(name = "freeze_balance", nullable = false, precision = 2)
  private BigDecimal freezeBalance;


  @Column(name = "acct_type", nullable = false)
  private Long acctType;


  @Column(name = "balance_type")
  private Long balanceType;


  @Column(name = "status")
  private Long status;


  @Column(name = "version")
  private Long version;

  /**
   * 创建人
   */
  @Column(name = "create_by", updatable = false)
  @CreatedBy
  private Long createBy;

  /**
   * 修改人
   */
  @Column(name = "modified_by")
  @LastModifiedBy
  private Long modifiedBy;

  /**
   * 创建时间
   */
  @CreatedDate
  @Column(name = "create_at", updatable = false)
  private Timestamp createAt;

  /**
   * 修改时间
   */
  @LastModifiedDate
  @Column(name = "update_at")
  protected Timestamp updateAt;


  @Column(name = "cust_cert_no")
  private String custCertNo;


  @Column(name = "cust_cert_type")
  private Long custCertType;


  @Column(name = "cust_name")
  private String custName;


  @Column(name = "cust_sex")
  private Long custSex;


  @Column(name = "cust_mobile")
  private String custMobile;


  @Column(name = "cust_phone")
  private String custPhone;


  @Column(name = "cust_email")
  private String custEmail;

  @Column(name = "cust_type")
  private Long custType;

  @Column(name = "cust_status")
  private Long custStatus;

  @Transient
  private String acctTypeName;

  @Transient
  private String statusName;

}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • 简介: 本文由浅入深地讲述了使用 Spring Data JPA 需要关注的各个方面,为读者了解和使用该框架提供了...
    AiPuff阅读 4,499评论 1 28
  • 2017年8月21日 我原本只想简单记录一下springboot中应用Jpa的简单操作。不想由于hibernate...
    行者N阅读 6,487评论 0 23
  • 一、JPA概述 1. JPA是什么 (1) Java Persistence API:用于对象持久化的 API(2...
    努力努力再努力_y阅读 3,197评论 0 4
  • 前言 由于公司一直在使用 JPA 作为 ORM 框架,因此分配到需要多表复杂查询或动态查询都很头大。很多人对 JP...
    StephenRo阅读 16,652评论 2 8
  • 干燥肌肤补水很重要,睡眠面膜成了很多女性的最爱。但是错误的使用方法会让你的肌肤备受伤害。下面,美白专家给大家列出些...
    智慧居家小南阅读 260评论 1 0