zoukankan      html  css  js  c++  java
  • 联合主键

    近期找一个数据不一致的问题,花了一周时间找bug,感觉很经典。虽然是填离职同事留下的坑。由于插入了很多错误数据,还需要一周的时间去手动修改错误数据(1千多条错误数据)。很坑啊有木有!!

    他的代码是这样的:

    @Entity
    public class PaymentDetailVO implements Serializable {
        @Id
        public Long duesdetailid;
    
        public String paymenttype;
        @Id
        public String paymethod;
    
        public BigDecimal payamount;
    
        
    }
    // 前面代码省略
    
        paymentdetailsql.append("select t.id as duesdetailid,")
                                            .append("  '1' as paymenttype,")
                                            .append(" ddl.value as paymethod,")
                                            .append(" (sum(ts.price)-nvl(sum(tr.returnamount),0)-nvl(sum(tc.ticketprice),0)) as  payamount")
                                            .append(" from Ticketturnoverdetail t ")
                                            .append(" left join ticketsell ts on t.id = ts.turnoverdetailid ")
                                            .append(" left join ticketreturn tr on t.id=tr.turnoverdetailid ")
                                            .append(" left join ticketcancel tc on t.id=tc.turnoverdetailid ")
                                            .append(" left join digitaldictionarydetail ddl on ddl.digitaldictionaryid=50 and ddl.code=ts.paymethod")
                                            .append("  where (ts.paymethod <> '0' and ts.paymethod <> '2' and ts.paymethod <> '3')   and t.id=:id")
                                            .append(" group by ddl.value,'1',t.id")
                                            .append(" union all")
                                            .append(" select t.id as duesdetailid,")
                                            .append("  '1' as paymenttype,")
                                            .append(" ddl.value as paymethod,")
                                            .append(" (sum(ts.price)-nvl(sum(tr.returnamount),0)-nvl(sum(tc.ticketprice),0)) as  payamount")
                                            .append(" from Ticketturnoverdetail t ")
                                            .append(" left join ticketsellagent ts on t.id = ts.turnoverdetailid ")
                                            .append(" left join ticketreturn tr on t.id=tr.turnoverdetailid ")
                                            .append(" left join ticketcancel tc on t.id=tc.turnoverdetailid ")
                                            .append(" left join digitaldictionarydetail ddl on ddl.digitaldictionaryid=50 and ddl.code=ts.paymethod")
                                            .append("  where (ts.paymethod <> '0' and ts.paymethod <> '2' and ts.paymethod <> '3')   and t.id=:id")
                                            .append(" group by ddl.value,'1',t.id");
                            Query ticketquery = JPA.em().createNativeQuery(paymentdetailsql.toString(),PaymentDetailVO.class);
                            ticketquery.setParameter("id", ticketturnoverdetail.getId());
                            List<PaymentDetailVO> paymentdetaillist = new ArrayList<PaymentDetailVO>();
                            try {
                                paymentdetaillist = ticketquery.getResultList();
                            } catch (Exception e) {
                                e.printStackTrace();
                                play.Logger.error("=============:%s", e.getMessage());
                            }
                            for(PaymentDetailVO paymentdetail : paymentdetaillist){
                                PaymentDetail _paymentdetail = new PaymentDetail();
                                _paymentdetail.duesdetailid=paymentdetail.duesdetailid;
                                _paymentdetail.paymenttype=paymentdetail.paymenttype;
                                _paymentdetail.paymethod=paymentdetail.paymethod;
                                _paymentdetail.payamount=paymentdetail.payamount;
                                _paymentdetail.createtime=new Date();
                                _paymentdetail.save();
                            }
    
    //后面代码省略

    看出问题了么?他使用

    duesdetailid和paymethod作为联合主键,但是查询语句用的是union all 将2个group by 给连接起来。插入paymentdetail 的时候jpa认为是第一条和第二条是同一条数据,导致第一条数据插入了2次,而第二条没有插入。

    如何修改呢?只要把外面再套一层group by 就行了。然后paymenttype也要加入联合主键。前面加上@Id


  • 相关阅读:
    QFramework 使用指南 2020(二):下载与版本介绍
    QFramework 使用指南 2020 (一): 概述
    Unity 游戏框架搭建 2018 (二) 单例的模板与最佳实践
    Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介
    Unity 游戏框架搭建 2017 (二十三) 重构小工具 Platform
    Unity 游戏框架搭建 2017 (二十二) 简易引用计数器
    Unity 游戏框架搭建 2017 (二十一) 使用对象池时的一些细节
    你确定你会写 Dockerfile 吗?
    小白学 Python 爬虫(8):网页基础
    老司机大型车祸现场
  • 原文地址:https://www.cnblogs.com/feiyunaima/p/6758418.html
Copyright © 2011-2022 走看看