用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的基本方法
12 个月之前 回复
hey_wanzi
VanziWu 谢谢你的讲解,问题已经解决,我是非计算机专业,对web编程这块不太熟悉,以后有疑惑可能还会麻烦你。
12 个月之前 回复

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

1
hey_wanzi
VanziWu 谢谢你花费时间解惑,我试了下,直接在session.createSQLQuery()后添加executeUpdate()会报错,另起一行写sqlQuery.executeUpdate();可以解决问题,感谢你提供思路。
12 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
往表里插一条记录
现在有一条sql语句这样往一个表里插数据,我没这么写过不知道结果什么样,现在也不方便测试。所以写出来让大家帮我看rn一下,我猜的结果对不对。rninsert into t1(rn name)rnvaluesrn("zhang")rnrn这个表肯定不是一个字段,这样插进去的结果是不是这样:rn id name telrn 1 zhang null
能否实现数据库插入一条记录或修改一条记录的时候,对另一个数据库进行修改?
两个数据库不在同一台服务器,数据库A插入或修改一条记录时,能否对数据库B也进行操作?或都数据库A插入或修改数据时,启动服务器一个程序,有高手能解答一下吗?谢谢
记录数据库修改记录
如何记录数据库中的表,视图的结构等的改动,如何知道某人修改了库结构之类的呢?rn通过profiler或其他之类的可以吗?只要记录数据表结构的改动
如何用FILE修改某一条记录?
[code=C/C++]rn//结构体定义rntypedef struct//这是记录的结构体,大小是35rnrnchar content[35];rnITEM;rnrn...rnrn//在文件末添加一条新记录rnITEM item;rnFILE* fpFile;rnfpFile = fopen("C:\\fuck.txt",ab);rnif(fpFile)rnrnfwrite(&item, sizeof(ITEM), 1, fpFile);rnrnfclose(fpFile);[/code]rnrn假设文件C:\fuck.txt中有很多条记录,那如何修改该文件中的第25条记录呢?
用一条记录update另一条记录
例如 no id name rn 1000 01 张山rn 1001 02 李四rnrn我想用no=10001的id和name更新no=1000的id和name。rnrnrn求SQL语句。
怎么修改一条记录
CString sql="update wuliu set siji_name=m_sName ";
怎样修改一条记录?
sSQL = "update Table set data = '" & data & "' where ID = " & rncon.Execute sSQL,, adCmdTextrnrn后面这个id怎么写啊?
修改最近的一条记录
我想根据时间排序,修改时间离现在最近的那条记录,该如何做?rn比如:rnc1 c2 c3 rna aa 2013-01-02rnb bb 2013-10-12rne ee 2013-10-29rnrnrn有这么几条记录,我想修改时间为2013-10-29那条记录,SQL语句应该如何写啊?
用sql怎么实现定位上一条记录\下一条记录\第一条记录\最后一条记录?
用sql怎么实现定位上一条记录\下一条记录\第一条记录\最后一条记录?
数据库 修改一条记录的某几个字段的植
比如说我的数据库的一条记录为rnGID NAME YEAR CLASSrn.........................rn............................rn................rn1005 ZHANGSAN 15 4rn...........................rn我想修改为rn LISI 12 2 rn rn其中GID为主键
用studio.net怎么实现数据库记录修改?
已经可以浏览了,rn现在我想做修改.rnrn谢谢!
Hibernate 记录修改
[color=#FF0000]MMoStu.jsp[/color]rn<%@ page language="java" import="java.util.*,com.*,bean.*" pageEncoding="utf-8"%>rn[color=#0000FF]<%@page import="service.ShowStu"%>[/color]rn<%rnString path = request.getContextPath();rnString basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";rn%>rnrnrnrn rn rn rn rn Managerrn rn rn rn rn rn rn rnrn rn rn rn <%String yy;rn if((String)session.getAttribute("mt")!=null)rn yy=(String)session.getAttribute("mt");rn elsern yy="aa";rn rn String u=request.getParameter("MName");rn if(yy.equals(u))rn elsern response.sendRedirect("Index.jsp");rn rn %>rn rn rn rn 教学管理rn rn rn 注销rn rn rn rn rn [color=#0000FF]<%String MName= request.getParameter("MName");[/color]rn %>rn 修改学生信息rn 修改教师信息rn 修改课程信息rn 添加学生信息rn 添加教师信息rn 添加课程信息rn 统计成绩情况rn 更改密码rn rn rn [color=#0000FF]<%try rn List list=obj.XueShen();rn out.println(" ");rn out.println(" ");rn out.println(" ");rn out.println(" "+"学号"+"");rn out.println(" "+"姓名"+"");rn out.println(" "+"性别"+"");rn out.println(" "+"班级"+"");rn out.println(" "+"联系电话"+"");rn out.println(" "+"所 在 系"+"");rn out.println("");rn out.println("");rn for(int i=0;i ");rn session.setAttribute("as",MName);rn out.println(" ");rn out.println(" ");rn out.println(" ");rn out.println(" ");rn out.println(" ");rn out.println(" ");rn out.println(" 删除");rn out.println(" ");rn out.println("");rn out.println("");rn rn out.println("");rn catch(Exception ex)rn out.print(ex);rn rn %>[/color] rn rn rnrnrnrn[color=#FF0000]servlet[/color]rnpackage Servlet;rnimport java.io.IOException;rnimport java.io.PrintWriter;rnimport service.MoXueSheng;rnimport javax.servlet.ServletException;rnimport javax.servlet.http.HttpServlet;rnimport javax.servlet.http.HttpServletRequest;rnimport javax.servlet.http.HttpServletResponse;rnpublic class MoStu extends HttpServlet rn public void doGet(HttpServletRequest request, HttpServletResponse response)rn throws ServletException, IOException rn [color=#0000FF]response.setContentType("text/html");rn PrintWriter out = response.getWriter();rn String dp="00000000";rn String sno=request.getParameter("Sno");rn String sname=request.getParameter("Sname");rn String sex=request.getParameter("Sex");rn String classno=request.getParameter("Classno");rn String sphone=request.getParameter("Sphone");rn String dep=request.getParameter("Dep");rn MoXueSheng stu=new MoXueSheng();rn tryrn stu.MoXS(sno,sname,sex,classno,sphone,dep);rn catch (Exception ex)rn rn response.sendRedirect("MMoStu.jsp?MName="+dp+"");[/color]rn rn public void doPost(HttpServletRequest request, HttpServletResponse response)rn throws ServletException, IOException rn doGet(request,response); rn rnrnrnrnrnrn[color=#FF0000]javabean[/color]rnpackage service;rnimport org.hibernate.*;rnimport java.util.*;rnimport bean.Student;rnimport org.hibernate.cfg.Configuration;rnimport com.HibernateSessionFactory;rnpublic class MoXueSheng rn public void MoXS(String sno,String sname,String sex,String classno,String sphone,String dep)rn [color=#0000FF]Session session=HibernateSessionFactory.getSession();rn Transaction tran=session.beginTransaction();rn Student stu=(Student)session.get(Student.class,sno);rn stu.setSname(sname);rn stu.setSex(sex);rn stu.setClassno(classno);rn stu.setSphone(sphone);rn stu.setDept(dep);rn session.saveOrUpdate(stu);rn session.flush();rn tran.commit();[/color] rn rnrnrnxml配置都对的,但是运行起来点击“编辑”没反应,将javabean改成rn[color=#FF0000]javabean[/color]rnpackage service;rnimport org.hibernate.*;rnimport java.util.*;rnimport bean.Student;rnimport org.hibernate.cfg.Configuration;rnimport com.HibernateSessionFactory;rnpublic class MoXueSheng rn public void MoXS(String sno,String sname,String sex,String classno,String sphone,String dep)rn [color=#0000FF]Session session=HibernateSessionFactory.getSession();rn Transaction tran=session.beginTransaction();rn Student stu=(Student)session.get(Student.class,sno);rn stu.setSphone(sphone);rn session.saveOrUpdate(stu);rn session.flush();rn tran.commit();[/color] rn rnrn修改完后改了Sphone点击“编辑”能修改,但是再点击“编辑”sname、dept就变成乱码了。我想弄的是知道sno,sno是主键,根据sno可以修改sname、sex、classno、sphone、dept的记录,到底应该怎么弄?
Hibernate 修改记录问题
有一个单位表,一个级别表,一个地区表;单位表两个外键级别ID,地区ID;现在我把单位表取了出来;如图所示rn[img=C:\1111.JPG][/img];但是修改时从修改页面到单位列表页面;级别ID,地区ID都为空要刷新一次才显示出来;rn各位大师,怎么样不刷新就显示出来???
hibernate修改记录
我用的是struts+hibernate,我现在问的是hibernate怎么修改记录。请大家给一段你们写好的修改表中某个记录的某个属性的值得代码。谢谢
hibernate修改记录问题
spring+hibernate开发的rn我现在要修改一条记录,首先在修改窗口中,把记录加载进来,但是,修改后,点“保存”后,却执行的是insert,而不是update,我问下,这方面,你们是怎么做的 ,请求解答,最好给部分代码,谢谢
求助 数据库插记录的问题
user表第一个字段userid是 自动编号,当我向user表插入一条记录的同时把userid插入另一个表中。rn请大家帮忙啊
某一条记录的复制问题。
我有一个表a,里面有一条记录b,该条记录的id值为12,我想增加一条记录,该条记录c,记录c和记录b相同,但由于id字段是自动加一的,因此新增加的id值为13,请问有一条记录的复制的sql语句马?
mysql复制某一条记录
$sql="insert into table1 (*) select * from table1 where id=$id";rnrnrn上面是错误的rnrn1.ID自动增加rn2.复制所有字段内容rnrn请问要怎么完善。
如何修改数据库中最后一条的记录
大家看看这样写错哪了?rnrnSet Rs=Server.CreateObject("adodb.Recordset")rnSql="select * from guest where id"rnrs.open sql,conn,3,2rnif rs.eof thenrnrs("zhuti")=zhutirnrs("typeh")=typehrnrs("Content")=Contentrn rs.updatern end if
插入数据库一条记录
数据库有一个字段hot 类型为 是/否rn默认情况下为否(false)rn我插入一条记录,要把这个字段变为 是(ture)请问下面一句该怎么改?rnrnwriter="yy"rntopic="uuu"rnconn.execute "insert into topics (topic,writer,hot) values('"&topic&"','"&writer&"',"ture")"rnrn谢谢
数据库死锁一条记录
今天用vpn连接到远程数据库 rn先是插入了一条记录 rn然后在跟新了这条记录 rn在后来想删除此条记录 就在也删除不了咯 rn数据库中其他表可以正常操作,这个表里的其他记录也可以,就是自己插入的那一条记录只能查询 不能update 和删除。rnrn重启了pl/sql重启电脑 也不行,怎么回造成单独的一条记录死锁 奇怪 rn望高手解答。
MYSQL取出某条记录的前一条和后一条的记录
MYSQL取出某条记录的前一条和后一条的记录?如何写?谢谢!
hibernate查询一条记录的问题?
能不能只写一个方法就能对所有表做单条记录的查询!(建议者有分!)
Hibernate怎样增加一条记录
oracle的表含有序列最好详细点
在一表中取出了一条记录,然后要把这条记录修改或删除该怎么做啊??
不会还要先找出这条记录的那几个字段,然后根据这个条件删除这条记录吧??有没有什么其他的方法呢??rn
ADODC控件怎么插和一条记录?!
我用那个adodc1.recordset.insert时,老是提示我没有定义,如果我想在第6条记录后插入一条记录的话,用adodc要怎么写呢?可以实现吗?rnrn 还有就怎么将一个表的内容整个或是有选择的复制到另一个表中,用adodc或是data~rnrn谢谢各位大哥…
如何手工在数据库记录中间插一条记录!
例如:rn ID NAMErn 1 YYrn 2 BBrn 3 CCrnrn我如何在2和3之间手工加入一条21 DD 记录。
用hibernate插入记录?
先看一段代码:public void addUser()rn User userinfo=new User();rn userinfo.setName("中文");rn //userinfo.setName("en");rn userinfo.setPassword("zhtu");rn Session session=HibernateSessionFactory.currentSession();rn Transaction tr=session.beginTransaction();rn session.save(userinfo);rn tr.commit();rn HibernateSessionFactory.closeSession(); rnrn这是用hibernate向MySQL数据库表是插入一条记录的一个方法.rn我的问题是为什么插入中文会是乱码呀?怎么才能解决这个问题呀?rn我用MySQL总是有乱码,晕呀。
一条记录的上下记录
我想实现一个页面是:rnrn       标题rn内容rnrn-----------rn上一篇:xxxxxrn下一篇:xxxxxrnrn这上一篇和下一篇怎么用ASP实现。rnrn
向数据库中添加一条记录后再提取该记录的自动编号有什么好的办法
我向数据库添加了一条记录 其中的主索引字段是由数据库自动编号的rn我希望添加完后立即返回该自动编号的值 各位有什么好的方法没有rn(该数据库中只有主索引字段是不重复的)
asp 读取上一条记录和下一条记录!!在线等!!!!!!!!!!
id user passwordrn1 a a rn4 b b rn10 c crn用程序读取到第二条记录之后。。如何读取到上一条记录的ID和下一条记录的ID,,,在线等!!!!!!!!!!
[在线等]怎么样获得一条记录和它的下一条记录?
我有一个表,名为GPS,需要按时间顺序进行处理,于是我就按时间排序读出数据集,然后再取里面的记录,但是不能得到一条记录的下一条。rn[code=C#]rnstring str = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\复件 DB.mdb"; rn OleDbConnection thisConnection = new OleDbConnection(str);rn thisConnection.Open();// open the mdbrn string str_sql = @"SELECT PT_CODE,VT_X,VT_Y,VT_DATE FROM GPS ORDER BY VT_DATE ASC";rn OleDbDataAdapter thisAdaper = new OleDbDataAdapter(str_sql, thisConnection);rn OleDbCommandBuilder thisBuider = new OleDbCommandBuilder(thisAdaper);rn DataSet thisDataSet = new DataSet();rn thisAdaper.Fill(thisDataSet, "GPS");rn int i=0;rn foreach (DataRow datarow in thisDataSet.Tables["GPS"].Rows)rn rn i++;rn double x_1 = Convert.ToDouble(datarow["VT_X"]);rn double y_1 = Convert.ToDouble(datarow["VT_Y"]); rn DataRow next_row = thisDataSet.Tables["GPS"].Rows[[color=#FF0000]i + 1[/color]];rn double x_2 = Convert.ToDouble(next_row["VT_X"]);rn double y_2 = Convert.ToDouble(next_row["VT_Y"]);rn double k_pt = (y_1-y_2)/(x_1-x_2);//两点的斜率rn if (i == 2)//用来调试的rn rn MessageBox.Show("x1:"+x_1.ToString()+" y1:"+y_1.ToString());rn MessageBox.Show("x2:" + x_2.ToString() + " y2:" + y_2.ToString());rn MessageBox.Show(k_pt.ToString());rn rn rn rn[/code]rnrn红色部分是我采取的方法,既按当前行数+1取得下一条,但是结果发现她不是按我排序的行数算的,是按原表的函数排的!怎么办?
用触发器在删除某一条记录前把该记录insert到备份表
我的表叫contract,备份表叫contract_deleted.rn我想实现在删除contract里的记录时先把此纪录insert到备份表contract_deleted和contract_billing_deleted,下面是我写的触发器,可是有问题,如果把insert into contract_deleted 去掉的话是没问题的,请问是怎么回事?rnrnCREATE OR REPLACE TRIGGER CONTRACT_BEFORE_DELETE before deleternon CONTRACT for each rowrnbeginrn insert into contract_deleted rn (select CONTRACT_NUM, CUSTNAME, COMPANY_NAME, LOCATION, PROJECT_NAME, START_DATE, END_DATE, TERMINATION_DATE, BILLING_METHOD, BILLING_SCHEDULE, AUTO_RENEW, TCV, ONE_TIME_CHARGE, MONTHLY_CHARGE, CONTRACT_RECEIVED_DATE, REMARKS, CONTRACT_STATUS from contract where contract_num = :old.contract_num);rn rn insert into contract_billing_deletedrn (select contract_num, billing_date, bill_ref_num, amount, remarks from contract_billing where contract_num = :old.contract_num);rnrnend;rn/
无法修改数据库的记录
protected void Page_Load(object sender, EventArgs e)rn rn string sno = Session["sno"].ToString();rn string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=";rn strConnection += Server.MapPath("data/student.mdb");rn OleDbConnection myconn = new OleDbConnection(strConnection);rn myconn.Open();rn string sql = "select * from student where sno='" + sno + "'";rn OleDbCommand Comm = new OleDbCommand(sql, myconn);rn OleDbDataReader DR = Comm.ExecuteReader();rn while (DR.Read())rn rn TextBox1.Text = DR["resume"].ToString();//个人说明rn rn myconn.Close();rn rnprotected void Button1_Click(object sender, EventArgs e)rn rn string sno = Session["sno"].ToString();rn string strConnection = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=";rn strConnection += Server.MapPath("data/student.mdb");rn OleDbConnection myconn = new OleDbConnection(strConnection);rn string sql = "update student set resume= '" + TextBox1.Text + "' where sno='" + sno + "'";rn OleDbCommand Comm_up = new OleDbCommand(sql, myconn);rn myconn.Open();rn Comm_up.ExecuteNonQuery();rn message.Visible = true;rn message.Text = "修改成功!";rn message.Style["color"] = "green";rnrn myconn.Close();rn rnrn页面代码:rn rn rn rn rn rn
修改数据库记录问题
rnDim StrSQLrnrnStrSQL ="UPDATE BOOK1 SET PASSWORD = request("NEWPASSWORD") where NICKNAME = '" & NICKNAME & "'" rnrnconn.Execute StrSQLrnconn.closernrnrn为何运行后提示第2行语句未结束?rn
修改数据库记录的问题
用jsp从数据库中动态读出挪干记录:rna a arnb b brnc c crn现在想人为随机修改其中一行的字段值,写回数据库。该如何实现啊?
数据库记录修改问题
在dbgrid里如何用sql语句把当前记录某个字段的值修改为edit1里的值呢?
数据库记录修改问题!!
各位大侠:我想一次性把所有记录的某一字段内容都更新,但是出现了错误!rn代码如下:rnAdodc1.Recordset.MoveFirstrn40:rnIf Adodc1.Recordset.EOF = False ThenrnAdodc1.Recordset("ID") = irni = i + 1rnAdodc1.Recordset.MoveNextrnGoTo 40rnEnd IfrnAdodc1.Recordset.Update
数据库记录修改
请问一下rn我有一个表A (ID XM )等等rn我想 的到这个表的 修改 记录rn什么时候 什么人 修改了什么内容??rn改如何设计呢??
Yii2.0 修改数据库记录
1.方法一:使用updateCounters方法 $broswer=PostExtendsModel::find()->where(['post_id'=>$id])->one();//修改指定id的记录 $broswer->updateCounters(['browser'=>1]); 2.方法二:使用updateAllCounters方法 PostExtendsModel::update