NutzCN Logo
问答 动态表和update问题
发布于 2399天前 作者 qq_710cab78 2289 次浏览 复制 上一个帖子 下一个帖子
标签:

1、由于业务需要,把一个表分成了12个月,如下图
实体分表

2、然后有一个问题是想判断表里面同样的日期、同样的渠道,是否已经存在数据,如果有做更新操作,没有做新增操作。
发现按条件更新num=dao.update 一直都返回0,不是1----后面加了上面的 list查询,发现list里面是有数据的。
这块代码最后还是新增了一条数据。--update不能这样子写吗?

//插入第一个月表的数据
								TableName.run(monthStr, new Runnable() {
							        public void run() {
							        	List<ExcelSignIosMonth> list=dao.query(ExcelSignIosMonth.class, Cnd.where("dataDate", "=", newSign.getDataDate()).and("channel", "=", newSign.getChannel()));
							        	
							        	int num=dao.update(newSign,Cnd.where("dataDate", "=", newSign.getDataDate()).and("channel", "=", newSign.getChannel()));
							        	if(num==0){
							        		dao.insert(newSign);
							        	}
							        }
							    });

list图片
update图片
数据库图片

9 回复

晕了,这样写发现上传图片看不到实体分表

实体分表:ExcelSignIosMonth

/**
* 
*/
@Table("excel_sign_ios_month_${yufen}")
public class ExcelSignIosMonth {

newSign 是什么东西

看输出的SQL嘛

final ExcelSignIosMonth newSign=new ExcelSignIosMonth();
								try {
									BeanUtilEx.Copy(temp, newSign);
									newSign.setCreateTime(new Date());
									//让数据库自己生成
									newSign.setId(null);
									
									Date monthDate = sign.getDataDate();
									int month = monthDate.getMonth()+1;
									Integer monthNum = Integer.valueOf(month);
									String monthStr = monthNum.toString();
									if(monthNum<10){
										monthStr = "0"+monthStr;
									}
TableName.run(monthStr, new Runnable() {
							        public void run() {
							        	List<ExcelSignIosMonth> list=dao.query(ExcelSignIosMonth.class, Cnd.where("dataDate", "=", newSign.getDataDate()).and("channel", "=", newSign.getChannel()));
							        	
							        	int num=dao.update(newSign,Cnd.where("dataDate", "=", newSign.getDataDate()).and("channel", "=", newSign.getChannel()));
							        	if(num==0){
							        		dao.insert(newSign);
							        	}
							        }
							    });

输出的SQL合符预期吗?

我找找在哪里打印出 update的sql语句先,看看是否和业务要求的一致

int num=dao.update(newSign,Cnd.where("dataDate", "=", newSign.getDataDate()).and("channel", "=", newSign.getChannel()));
上面代码的写法,打印的sql:
UPDATE excel_sign_ios_month_04 SET data_date='2018-04-06 00:00:00',channel='1001',new_users_num=19282,create_time='2018-05-28 14:19:39',last_update_time='2018-05-28 14:17:28' WHERE id=NULL AND (data_date='2018-04-06 00:00:00' AND channel='1001');

发现nutz自动在后面加了WHERE id=NULL ,因为业务逻辑是只要时间和渠道一样就update原来数据,如果再查询出来再根据id来update,那么分表后又很复杂,加上数据量特别大。

用update带Chain参数的版本

添加回复
请先登陆
回到顶部