用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数据库也没有成功插进数据,如图:
图片说明
图片说明

2个回答

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

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

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

hey_wanzi
VanziWu 谢谢你花费时间解惑,我试了下,直接在session.createSQLQuery()后添加executeUpdate()会报错,另起一行写sqlQuery.executeUpdate();可以解决问题,感谢你提供思路。
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问