用hibernate等实现:从一数据库复制一条记录,然后修改该记录的某一列,再插入原数据库

目前该功能(简称copyinsert)可以在mysql数据库里用sql语句实现,我想用hibernate实现,大部分都已经完成,感觉在dao层有一些错误,希望大佬帮忙解惑,能够解决者,还可以另外给C币。
例子如下:(ID为自增,非数据库定义内容)
图片说明

数据库原来有三条记录,然后在mysql中输入查询语句:

INSERT INTO t_test(NO,NAME,SEX) SELECT REPLACE (NO,'XS1','XS4'),NAME,SEX FROM t_test WHERE NO='XS1';
图片说明

可以成功在mysql数据库中实现,结果如下:
图片说明

(从上面看,在数据库中直接操作是可以的,但是我想用框架实现)我用了hibernate,struts2,Jeasyui框架(基本都不熟练),目前能确定的是dao层的拼接的sql语句是正确的,但是不能实现插入数据库的功能。

系统主界面如下:
图片说明
点击datagrids上面的“复制并插入“按钮,期望实现**复制某一条信息,修改其中一列后再插入数据库中**(例子是,复制XS1信息,将XS1修改为XS99后,再插入原数据库)。主界面jsp关键代码如下:

//1."复制并插入信息"按钮作用
        $("#deriveBtn").click(function(){
            var no1="XS1";
            var no2="XS99";
            $.post("test_copyinsert.action",{"no1":no1,"no2":no2},function(data){

                if(data.success){
                    //刷新datagrid
                    $("#list").datagrid("load");
                    //提示
                    $.messager.show({
                        title:"提示",
                        msg:"insertcopy成功"
                    });
                }else{
                    $.messager.alert("提示","检索失败:"+data.msg,"error");
                }
            },"json");
        });
    });

下面是TestAction部分代码(主要体现copyinsert):

package test.action;

//copyinsert实现
private String no1;
public void setNo1(String no1) {//普通属性驱动,提供set方法进行接收
    this.no1 = no1;
}
private String no2;
public void setNo2(String no2) {//普通属性驱动,提供set方法进行接收
    this.no2 = no2;
}
public void copyinsert(){
    service.copyinsert(no1,no2);
}
}

下面是TestServiceImpl部分代码(主要体现copyinsert):

package test.service.impl;
@Override
public void copyinsert(String no1, String no2){
    dao.copyinsert(no1,no2);
}
}

下面是TestDaoImpl部分主要代码(主要体现copyinsert功能):

@Override
public void copyinsert(String no1, String no2) {
    // 获取Session
    Session session = HibernateUtils.getSession();
    try {
        Transaction tx = session.beginTransaction();
        String sql="INSERT INTO t_test (NO,NAME,SEX) SELECT REPLACE (NO,"+"'"+no1+"'"+","+"'"+no2+"'"+"),NAME,SEX FROM t_test WHERE NO="+"'"+no1+"'"+";";
        SQLQuery sqlQuery = session.createSQLQuery(sql);
        List list=sqlQuery.list();//就是这一行!!!!!
        tx.commit();
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    } finally {
        // 释放session
        session.close();
    }

其中,在上述TestDaoImpl代码中,我不太清楚“List list=sqlQuery.list();”的作用,但是如果没有添加这一行代码,运行程序(即点击主界面“复制并插入”按钮)后,数据库没有插入值,myeclipse的Console也没有输出任何新的查询语句;
当在上述TestDaoImpl代码中添加“List list = sqlQuery.list(); ”这一行代码后,再点击按钮运行,数据库仍然没有插入值,但是Console输出了查询语句,但是紧接着会报错,mysql数据库也没有成功插进数据,如图:
图片说明
图片说明

0

2个回答

List list=sqlQuery.list();是返回查询的list集合;
如果你没加这句,没输出是因为你前面的操作只是把资源加入类里面,并没有进行持久化操作,所有没有输出。
当你加了这句报错是因为sqlQuery.list();返回list集合。但你是insert操作,所以会报错。
使用sqlQuery.executeUpdate();即可执行原生sql语句。
你要知道SQLQuery的list()执行查询,executeUpdate()执行增删改操作就可以了

1
tongkaiming
tongkaiming 回复hey_wanzi: 这只是hibernate的基本方法
10 个月之前 回复
hey_wanzi
VanziWu 谢谢你的讲解,问题已经解决,我是非计算机专业,对web编程这块不太熟悉,以后有疑惑可能还会麻烦你。
10 个月之前 回复

List list=sqlQuery.list();这句代码作用是执行sql语句,创建了一个list去存储数据,也就是sql操作后的结果集存到了list里面,但是list并没有被操作,就会出现结果集无法被提取。
你的思路有问题,这里做的是插入操作,不需要返回结果集,代码应该是session.cretaeSQLQuery().executeUpdate()

1
hey_wanzi
VanziWu 谢谢你花费时间解惑,我试了下,直接在session.createSQLQuery()后添加executeUpdate()会报错,另起一行写sqlQuery.executeUpdate();可以解决问题,感谢你提供思路。
10 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
将查询出来的表数据修改一个或几个字段后,再插入到表中(oracle)
INSERT INTO tableName   SELECT seq_master.nextval,--自定义值(序列号)          TO_DATE('2012/01/01', 'YYYY/MM/DD'),--自定义值          CURR_SOURCE,--原始字段信息          CURR_DEST,--原始字段信息          EXCHANGE_RATE,
使用Hibernate修改数据库表中一条记录的某些字段
类似于新闻,当需要修改新闻标题和内容等字段时,对于发布时间,作者等信息需要保留原始的,因此需要修改某些字段,按照普通sql可以只更新某些字段,用Hibernate可以按照以下代码: Session s = HibernateUtil.currentSession(); HibernateUtil.beginTransaction();
(小笔记)()Oracle 批量复制一个数据表的数据,修改部分字段后追加加入到数据表中
insert into jwxt.jy_zyxx a (a.jxjhh, a.ssxqdm, a.nj, a.zydm, a.xklbdm, a.rs, a.bjs, a.zskcs, a.zdbyxf, a.ggbxxf, a.ggxxxf, a.xkbxxf, a.xkxxxf, a.zybxxf, a.zyxxxf1, a.zyxx
hibernate查询oracle数据库记录,一个字段为NULL整条记录就NULL的解决办法
1 问题描述 数据库表如下,选出来的这行有几个属性值为NULL,其中第4列 的QI oracle类型为number 实体类部分如下,其中 qi对应数据库表中的QI列,类型为double 使用sql语句在navicat中能正确查出数据,可是在hibernate中,查出的是空 2 解决办法 将实体类中的 类型为double 都改为 它的包装类Double就可以了。 3 问题原因 这个我目前也不清...
mysql同表拷贝数据,修改数据
当两个表有很多字段相同,需要从一个表
SQL复制一条除了主键外的记录
select * into A_bak from A update A_bak set A_ID = NEWID() insert into A select * from A_bak
hibernate对象的三种状态以及插完一条数据后立刻获取到该条数据id
瞬时态<br /><br /> 由new命令开辟内存空间的java对象,<br /><br /> eg. Person person = new Person(”amigo”, “女”);<br /><br /> 如果没有变量对该对象进行引用,它将被java虚拟机回收。<br /><br /> 瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或 saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应
sql复制表数据并修改某些列的值
MySQL将一张表的某些列数据,复制到另外一张表INSERT INTO t_topic_content(content,topicId) SELECT content,id FROM t_topic;注意:给某一列数据赋值,自增长,那么就不应该插入数据了MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容。方法同上, 只是查询的时候使用REPLACE(str,from_str,to_...
运用Hibernate机制,对mysql数据库中的表进行增,删,改,查
Hibernate中对数据的更改是基于对象的,,必须先找到对象再进行数据操作,寻找对象的关键是使用session的get(Student.class, "5")方法,Student.class为传入对象的实体类映射,“5”是对象在数据库中的主键,以下的代码中的主键为stuNO,类型为String,Student实体持久化类有三个属性,stuNo;stuName;sex 配置文件中不做任何修改,该
SQLITE中插入一条记录
update TAB1 set ID = ID + 1 where ID > 4; insert into TAB1(ID, NAME) values(5, 'new_name');
Hibernate 插入数据时候会覆盖原来的数据,每次就一条数据
最近刚刚开始学hibernate,每次插入数据数据时候发现插入同样的主键不会报错。查看表后发现每次新插入的数据都会替换上一条记录, 具体原因是: 在 [size=large]M01_Student.hbm.xml[/size]配置文件中设置了下面的一句 [code=&quot;java&quot;] create [/code] 把这句删除就可以了。 原因: ...
Hibernate修改一条记录
所以最直接的更新一个对象的方法就是在Session处于打开状态时load()它,然后直接修改即可: DomesticCat cat = (DomesticCat) sess.load( Cat.class, new Long(69) );  cat.setName(&quot;PK&quot;); sess.flush();  // changes to cat are automatically detecte...
SQL语句如何在同一个表内复制一条记录
SQL: insert into A(a,b,c) select top 3 a,b,c from B 说明:A,B是表,而且字段对应。
向数据库中插入一条记录后如何获得自动生成的列值?
(sql server 2005) 1、自动生成的列值的数据类型为int型 假如存在一张表,其主键为自增长的int型(起始值为1,增量值为1,如下所示: create table 职工表 ( 职工IDintprimary key identity ( 1, 1 ), 职工姓名varchar ( 64 )not null, );
SQLite 如何实现从一个数据库的某个表的记录复制到另一个数据库中
最近遇到了跨数据库复制表中记录问题
(如何)查询SQL数据库中一条记录中多列(字段)的数据最大值
如图2个列的数据,通过下面的sql来查询出每个ID的最大值在一条记录(行)中:SELECT id, MAX(max_data) FROM (SELECT id, data1 as max_data FROM 表名 UNION SELECT id, data2 FROM 表名) MaxData(必须再自定义一个表名) GROUP BY id;之后会如下图效果:自己摸索的转发请标明,谢谢...
Hibernate旅程(四)Hibernate对数据库删除、查找、更新操作
上篇,我们以向数据库添加操作来演示hibernate持久化对象的三种状态。本节继续hibernate对数据库的其他操作,删除、查询、修改。 Hibernate对数据删除操作 删除User表中个一条数据,是需要更具User表的主键id值来删除的。首先根据id值向数据库中查询出来对应的对象。可以采用两种方式一是session的get方法,一个是session的load方法。 Session的Ge
复制记录的sql语句
sql中复制一条记录的语法为:  insert into 表名 select * from 表名 where 条件; 复制一条记录 INSERT  into  account(id,name,money,PASSWORD)  select 4,name,money,PASSWORD from account where id=3 复制多条记录 INSERT INTO
myql中如何将同一张表中某几条记录的某个字段复制到另外几条相对应的记录的字段中(批量拷贝字段)
我们要实现的效果就是将图中上半部分title字段赋值给图中下半部分stattype对一个记录的title字段 假设表明为sys_test表,需要是使用到join,语句如下: update sys_test t1 join (select * from sys_test where mark='Mark1') t2 on t1.stattype = t2.stattype set t1.t
sql同一张表复制一条相同的记录
id为主键,自增列 SET IDENTITY_INSERT Test On insert into Test ([id] ,[NameCN] ,[NameEN] ) select (select top 1 Id from Test order by id desc)+1, [NameCN] ,[NameEN] from Test where id='1' SE
[SQL] 只更新表中某一部分数据的实现方法
(1)只更新表中前10条数据(更新为固定值) (2)用一个表的字段值更新另一个表的某字段值 (3)更新表前10条数据(更新为另一个表的数据)
一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18还是15 ?
一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是18;但是如果重启(文中提到的)MySQL的话,这条记录的ID是15。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。         但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是18。因为MylSAM...
Mysql 复制一条数据
从不同的表复制 insert into 表1 select * from 表2 where id =1   同一张表中复制(无主键) insert into 表1 select * from 表2 where id =1   同一张表中复制(有主键) insert into 表1(字段1,字段2,字段3) select 字段1,字段2,字段3 from 表
SQLite将一个数据库中的全部信息完全复制到另一个数据库中
Attach 'D:\Database\BS\attempt_201705071516_3631_r_000000_0_all_bs.db3' as T1; create table title_info as select * from T1.title_info; Detach T1
数据库单条记录并发读并更改问题
场景有1G的流量,很多人要占用这个流量进行充值。 数据库解决方案方案1:select for update事务控制,即用一个事务来包裹上面的SELECT+UPDATE操作,UPDATE/DELETE SQL尽量带上WHERE条件并在WHERE条件中设定索引过滤条件,否则会锁表,性能可想而知有多差了。方案2: 乐观锁1、从数据库表A,获得数据,记录乐观锁lock 2、业务操作 3. updat
Hibernate查询时,数据库返回多条纪录,封装后的对象却都是一样的问题
1. 背景 表的设计如下 2.实体类部分如下: public class WdsStRsvrREntity { @Id private String stcdt; private Date ymdhm; 使用jpa的 findByStcdtAndYmdhmBetween(String id,Date startTime,Date endTime)的函数查询时,会发现查出的所有...
程序模块中只能向数据库删除或者插入一条记录
在调用该模块的接口后,程序中打印日志内容包括删除语句,delete 掉了3条记录,并且再向这同一张表中插入一条记录。 而在数据库中,和日志内容不相符的是,数据库中的3条记录并没有删除,即delete语句没有起作用,仅仅是插入语句起作用,向表中插入了一条记录。 原因:该模块中 在service层 采用了@Transactional  注解,导致这些UPDATE、INSERT、DELETE语句只有
hibernate同时插入两条相同数据(偶尔)原因调查
项目测试阶段,遇到一个问题: 一条数据,会被同时更新两条,而且还是偶发的,这个就比较尴尬了,代码也顺过了,单人测试也测试过了,没什么问题。后来,在晚上找资料时,找到一篇博客,博文如下: 前几天和朋友讨论他遇到的问题:为什么hibernate会插入两条相同的记录(偶尔)? 是这么回事: 有两个表: A表 ,B表 一对一的关系,通过Quartz定时任务轮循A表,如果A表有新记录,则插入一条新记
同一张表中复制一条数据
INSERT INTO     pt_puzzle(`puzzle_pid`,`title`,`img`,`release_id`,`author_id`,`release_time`,`author_time`,     `last_edit_time`,`first_scene_id`,`second_scene_id`,`brand_id`,`style_id`,`type`,`descr...
Hibernate中利用Criteria进行数据库表数据的增加查询。
Hibernate 提供了操纵对象和相应的 RDBMS 表中可用的数据的替代方法。一种方法是标准的 API,它允许你建立一个标准的可编程查询对象来应用过滤规则和逻辑条件。         Hibernate Session 接口提供了 createCriteria() 方法,可用于创建一个 Criteria 对象,使当您的应用程序执行一个标准查询时返回一个持久化对象的类的实例.
向视图中插入数据的方法
<br />插入视图的条件: <br />  1.如果视图是基于一个基础表产生的,那么这就称为非连接视图,所有的非连接视图都是可以更新的,也就是说可以在该视图上进行,INSERT,UPDATE,DELETE的操作.<br />  2.如果是连接视图,那就要遵守基本更新准则了.现在我只对INSERT准则做一下说明:在INSERT语句中不能显式或隐式的引用到任何非码保留基础表中的字段,如果在定义视图中使用了WITH CHECK OPTION子句,那就不能对视图执行INSERT操作.<br />  注:码保留表,
Java中如何实现j并发更新数据库同一条数据
分情况来说:普通单应用并发、多应用或多台服务器并发 情况一:普通单应用并发 使用关键字synchronized就可实现。 情况二:多应用或多台服务器并发 因多个应用之间并非同一个jvm(应用)内,因此使用synchronized并不能满足需求。 具体处理方案包含以下几种: 1)数据库行级索,优点:简单粗暴;缺点:容易死锁&amp;amp;性能差,非数据库专业人士不建议使用。 2)写入请求分离...
使用hibernate插入数据的例子
数据库创建脚本: drop table person create table person( id varchar(32) not null primary key, name varchar(20) not null, password varc
SQLite实现不同数据库的表内容复制--从一个数据库把表和内容复制到另一个数据库
SQLite实现不同数据表之前内容复制 1)  在SQLiteExpert Personal 3中鼠标右键点击目的数据库dist的Attach  Database,将原数据库source附加在dist上。 2)  执行下面的SQL语句实现表格内容复制(将source数据库的表格table1中内容复制到dist的某一个表格中): l  当dist数据库已经存在table1表格, insert
SQL查询一个表中类别字段中Max()最大值对应的记录
SQL查询一个表中类别字段中Max()最大值对应的记录   SELECT A.id, A.name, A.version FROM DOC A, (SELECT id, MAX(version) AS version FROM DOC GROUP BY id) AS...
hibernate实现表联查并获取某个字段的最大值(随笔)
最近试用hibernate实现三表连接查询并分组显示某个字段的最大值,在mysql中语句可以运行,改成hql无法运行,遂写下随笔以记录 mysql中查询,可以查询到相应的结果 改写成hql语句 "select o.equipment.equId, o.olderName , e1.power, max(opr.oTime),e1.location from Older o ,Equi
对某一字段分组后,取出另一字段最大值的所有记录
表:t_test -------------------------------------- id(int) cost(int) des Autoid(id) -------------------------------------- 1 10 aaaa 1 1 15 bbbb 2 1 20 cccc 3 2 80 aaaa 4 2 100 bbbb 5 2 60 dddd 6 3 500 dddd 7 -------------------------------------- 取每一类id中cost最大的纪录
hibernate删除数据
我这里用到的是把一张表里的数据都删除 //创建一个事务 //根据hibernate配置文件的配置信息,创建一个configuration实例 Configuration configuration = new Configuration().configure(); //创建SessionFactory实例 SessionFact...
hibernate向MySQL里面添加数据表和数据
1.新建一个java project项目,里面加入hibernate、Junit、MySQL要用的jar包,然后新建一个source folder取名为test,在src和test里面加入相应的文件。整体的框架图如下图所示: 2.Studens.java里面的代码如下所示: import java.util.Date; public class Studens { priva
mysql存储过程循环修改每一条数据
mysql 使用存储过程 循环逐条判断修改表中每一条数据
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 数据库课程教研记录 数据库课程教研记录