VanziWu 2018-08-21 17:54 采纳率: 100%
浏览 2177
已采纳

用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条回答 默认 最新

  • tongkaiming 2018-08-22 01:11
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题