CREATE TABLE `userexpands` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`usercharge` int(11) DEFAULT NULL,
`remain` int(11) NOT NULL DEFAULT '0',
`sentcount` int(11) NOT NULL DEFAULT '0',
`mscount` int(11) NOT NULL DEFAULT '0',
`sent` int(11) NOT NULL DEFAULT '0',
`recharge` int(11) unsigned NOT NULL DEFAULT '0',
`time` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `usercharge` (`usercharge`),
CONSTRAINT `userexpands_ibfk_1` FOREIGN KEY (`usercharge`) REFERENCES `usercharge` (`id`) ON DELETE SET NULL ON UPDATE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;CREATE TABLE `usercharge` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`balance` int(11) NOT NULL DEFAULT '0',
`sent` int(11) NOT NULL DEFAULT '0',
`expand` int(11) NOT NULL DEFAULT '0',
`cost` int(11) NOT NULL DEFAULT '750',
`note1` varchar(255) DEFAULT NULL,
`note2` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
userexpands表和usercharge表的关系是1对多,userexpands表中的usercharge指向usercharge表的主键。
现在想对userexpands表中所有time>mytime,usercharge不为空的记录进行更新。
更新如下:userexpands.sentcount = usercharge.sent, userexpands.sent = usercharge.expand。
请问如何写出这样联合两个表的数据对userexpands表中的数据进行更新的HQL或SQL语句?
本人初接触数据库,用的是Hibernate+MySQL。
我原来的想法是根据这两个表查询出所有符合条件的userexpands,再逐条对返回集合中的记录进行更行,更新的时候加载相应的usercharge数据。但是这样效率不高,所以求一条能够实现上述更新的HQL或SQL语句。
解决方案 »
- 用了一周时间在Linux就学会了一门新的编程语言vala叽哩哇啦
- 新手请教 tomcat+jsp+sqlserver2000配置问题
- 请教javascript播放声音的一个问题,很奇怪的一个问题
- 请教高手关于整合APACHE和TOMCAT时候APACHE的httpd.conf文件配置问题--问题很多
- jsp连接sql server 问题
- 高分求编辑gif图片java代码
- 急救啊, 关于eWebEditor在线文本编辑器--飞鱼修改版的问题
- s:doubleselect的问题,第二个级联下拉框显示异常
- 望指教tomcat 如何配置datasource???
- intelliJ IDEA14把jsp编译后的java文件放在哪里了
- 如何在tomcat中配置poxool为jndi
- <bean:write/>输出的内容怎么才能自动换行
同样把userexpands.sent更新为usercharge.expand。
也就是一共更新userexpands表中的两个数据:sentcount和sent。这两个数据的来源为和该条记录相关联的usercharge表中的sent数据和expand数据。
在Userexpands对象中存在一个Usercharge的对象,对应usercharge字段如果仅涉及这两个表,可在userexpands表的映射文件中配置其lazy="false"属性。
这样在查询出所有Userexpands中所有字段的同时就可以查询出对应的多个Usercharge对象的详细内容。你的意思是要把Userexpands对象中的sentcount更新为Usercharge对象中的sent,同时把Userexpands对象中的sent更新为Usercharge对象中的expand(不知道我这样理解是否符合你的需求)String sql = "update userexpands set sentcount=?,sent=? where.....";
===========================
如果按hql语法的话,我觉得你的需求有问题,既然Userexpands对象中已经包含了对应的多个Usercharge对象,为什么还要把Usercharge对象中的字段再更新到Userexpands对象的字段中??要这些重复数据有什么用?
你更新的时候无非就是为了方便展示,但是用hibernate中面向对象的对表进行操作也可以很方便的把数据展示出来
我的目的是根据usercharge表更新某个时间段的userexpands表的数据。
想对userexpands表中所有time>mytime,usercharge不为空的记录进行更新。
--那你的意思是usercharge是主表?userexpands是分表?update userexpands set sentcount=t2.sent,sent=t2.expand
from userexpands as t1 left join usercharge as t2 on t1.=t2.
where t1.time>mytime这个意思吗?
还是觉得描述得摸摸忽忽的,,,你给个例子多愉快的
我试试你的sql先:)
t1.=t2. 需要分别带两个表的关联字段
还有最好用
把left join替换成inner join -=-
希望还没发生悲剧
usercharge表有数据
id sent expand
1 100 1000
2 200 340
userexpands表有数据
id sentcount sent time usercharge
1 0 0 09-01-01 1
2 0 0 09-02-01 1
3 0 0 09-01-01 2
4 0 0 09-02-01 2
5 0 0 09-02-01 null
假如现在将所有时间在09年1月30号之后且外键usercharge不为空的userexpands数据进行更新,那么
符合条件的userexpands记录有2和4。
2对应的usercharge的id为1,这里标记为2和1。
2.sentcount = 1.sent = 100
2.sent = 1.expand = 1000
4对应的usercharge的id为2,这里标记为4和2。
4.sentcount = 2.sent = 200
4.sent = 2.expand = 340。
更新完成后userexpands表的数据
id sentcount sent time usercharge
1 0 0 09-01-01 1
2 100 1000 09-02-01 1
3 0 0 09-01-01 2
4 200 340 09-02-01 2
5 0 0 09-02-01 null
我试验了上面的sql语句,执行出错啊。
org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: from near line 1, column 81 [update com.soochow.ecompex.dao.Userexpands set sentcount=t2.sent,sent=t2.expand from com.soochow.ecompex.dao.Userexpands as t1 left join Usercharge as t2 on t1.usercharge=t2.id where t1.time>= :monthtime and t2 !=null]; nested exception is org.hibernate.hql.ast.QuerySyntaxException: unexpected token: from near line 1, column 81 [update com.soochow.ecompex.dao.Userexpands set sentcount=t2.sent,sent=t2.expand from com.soochow.ecompex.dao.Userexpands as t1 left join Usercharge as t2 on t1.usercharge=t2.id where t1.time>= :monthtime and t2 !=null]
userexpands 表有
而usercharge 不存在,,且又满足 time>mytime
那些字段会因为没有对应的需要的填充的usercharge资料,全部被update成null
String q = "update Userexpands set sentcount=t2.sent, sent=t2.expand"+
" from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge.id=t2.id"+
" where t1.time>= :monthtime and t2 !=null";
没有办法直接测试罗,,,
我这个SQL语句是针对MSSQL写的
难道说你的环境里面不支持update 使用from吗?
你只有多调试下了- -
t2!=null呢?
t2是个表的别名啊
org.hibernate.hql.ast.QuerySyntaxException
这样刷网页好痛苦,,有QQ吗?
String q = "update Userexpands set sentcount=t2.sent, sent=t2.expand"+
" from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge.id=t2.id"+
" where t1.time>= :monthtime";
那个t2 !=null是不对,但是现在还是不行啊~~~~(>_<)~~~~
各位帮帮忙啊,这个sql语句到底是哪里错了?我在my sql里面执行不了,总说是语句错误。
select* from Userexpands as t1 inner join Usercharge as t2 on t1.usercharge=t2.id 这句可以运行,肯定是没错的。
最后加个 where 条件,比如
where id =100; 试试能不能成功。