执行原生态的SQL(删除语句)报错了,请大神帮忙看看?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了执行原生态的SQL(删除语句)报错了,请大神帮忙看看?相关的知识,希望对你有一定的参考价值。

StringBuffer sql = new StringBuffer("DELETE from TB_NAME a where ssid="+id);
Query query=em.createNativeQuery(sql.toString());
query.executeUpdate();
执行以上代码,会报错
Caused by: javax.persistence.TransactionRequiredException: Executing an update/delete query

需要启用事务,你在执行update操作
你看一下em有没有beginTransaction()之类的方法。

1、若你有使用spring,可以在这个方法体上加上注解:@Transactional
2、在执行query.executeUpdate();的之前增加一句em.joinTransation();
参考技术A

SQL的删除语句就是DELETE 语句

DELETE 语句用于删除表中的行。

语法:DELETE FROM 表名称 WHERE 列名称 = 值

删除某行:DELETE FROM 表名称 WHERE  列名称 = 值(删除条件)

删除所有行:可以在不删除表的情况下删除所有的行。这意味着表的结构、属性和索引都是完整的:DELETE FROM 表名  或者:DELETE * FROM 表名 。

通过使用 DROP 语句,可以轻松地删除索引、表和数据库。

DROP  INDEX  索引名称

DROP TABLE 表名称

DROP DATABASE  数据库名称

不删除表,只删除表中的数据:TRUNCATE TABLE 表名称

文中的错误主要在以下几个方面:

第一,文中所使用的“createNativeQuery”方法只能用于查询,不能用于增删改。

第二,需要启用事务,你在执行“update”中操作

第三,你看一下em中有没有beginTransaction()之类的方法。

1、若你有使用spring,可以在这个方法体上加上注解:@Transactional

2、在执行query.executeUpdate();的之前增加一句em.joinTransation();

参考技术B createNativeQuery
方法只能用于查询哈 不能用于增删改
参考技术C 异常提示需要使用事务。
加上注解@Transactional试试看。

刚学数据库,遇到一道关于数据库sql语句的题目,实在不会,请高手帮忙解答一下,谢谢!

EMPLOYEE(ESSN,Ename,Sex,Salary,Dnumber),其中ESSN是主键, 存储员工的信息,包括社会保险号、姓名、工资、所属部门号
DEPARTMENT(Dnumber,Dname,MgrSSN) 其中Dnumber是主键,存储部门信息,包括部门编号、名称、经理社会保险号
PROJECT(Pnumber,Pname,Pcity) 其中Pnumber是主键,存储项目的信息,包括项目编号、名称、所在城市
WORKS_ON(Pnumber,ESSN,Wdate,Hours) 其中Pnumber、ESSN、Wdate是主键,存储某员工在某日为某项目工作的时间

请用SQL语句实现下面计算:
(1)求工资高于其所在部门平均工资的职工姓名
(2)求至少在三个不同项目中工作过的职工姓名
(3)建立视图DeptPro(Dnumber,Pnumber,Thours),表示每个部门的所有职工在每个项目中的工作总时数。并利用该视图,求在项目'Middleware'中工作时数最多的部门名称。

参考技术A 1. select * from EMPLOYEE where Salary>(select avg(Salary) from EMPLOYEE group by Dnumber)
2. select * from EMPLOYEE where ESSN in (select ESSN from WORKS_ON group by Pnumber,ESSN having Count(1)>=3)
3. -- 每个部门的所有职工在每个项目中的工作总时数
Create View DeptPro
AS
select Pnumber, Dnumber, Dname, sum(Hours) Hours from (
select A.Pnumber, A.Hours, C.Dnumber, C.Dname
from WORKS_ON A
Inner join EMPLOYEE B on A.ESSN=B.ESSN
Inner join DEPARTMENT C on B.Dnumber=C.Dnumber
) Tbl group by Pnumber,Dnumber,Dname

--工作时数最多的部门名称。
select Max(Hours) Hours, Dnumber, Dname from DeptPro
where Pnumber in (select Pnumber from PROJECT where Pname='Middleware')
group by Dnumber, Dname
参考技术B (1)
SELECT Ename, Dnumber, Salary FROM EMPLOYEE
JOIN
(SELECT Dnumber, avg(Salary) AS Asalary FROM EMPLOYEE
GROUP BY Dnumber) A
ON Dnumber = A.Dnumber
WHERE Salary > A.Asalary
ORDER BY Dnumber
(2)
SELECT Ename FROM EMPLOYEE
JOIN
(SELECT ESSN, COUNT(Pnumber) AS Pcount FROM WORKS_ON
GROUP BY ESSN
HAVING COUNT(Pnumber) > 3) A --未考虑同一个职工在不同时期参加同一个项目情况
ON ESSN = A.ESSN
(3)
CREATE VIEW DEPTPRO AS
(SELECT Dnumber, Pnumber, SUM(Hours) AS Thours FROM WORKS_ON
GROUP BY Dnumber, Pnumber); --每个部门的所有职工在每个项目中的工作总时数
SELECT A.Pname FROM DEPTPRO
JOIN DEPARTMENT A
ON Dnumber = A.Dnumber
JOIN PROJECT B
ON Pnumber = B.Pnumber
WHERE B.Pname = 'Middleware'
AND Thours = MAX(Thours);--在项目'Middleware'中工作时数最多的部门名称追问

你好,首先谢谢你回答我的提问。
请问第(2)问如果考虑同一个职工在不同时期参加同一个项目情况时sql语句怎么写?
第(3) 问创建视图好像有点问题,WORKS_ON表中没有Dnumber这个属性,所以
GROUP BY Dnumber, Pnumber时这个属性是没有的,如果去掉这个Dnumber,则不是题目中所要求的每个部门的所有职工在每个项目中的工作总时数。

追答

你好。
第一个问题:
因为要求返回“至少在三个不同项目中工作过的职工姓名”,所以考虑同一个职工在不同时期参加同一个项目情况时,还需要去掉重复的项目。
SELECT Ename FROM EMPLOYEE
JOIN
(SELECT ESSN, COUNT(Pnumber) AS Pcount FROM
(SELECT DISTINCT ESSN, Pnumber FROM WORKS_ON) --去掉重复的员工—项目记录
GROUP BY ESSN
HAVING COUNT(Pnumber) > 3) A --考虑同一个职工在不同时期参加同一个项目情况
ON ESSN = A.ESSN

第二个问题:
是我修改时疏忽了。
CREATE VIEW DEPTPRO AS
(SELECT C.Dnumber, Pnumber, SUM(Hours) AS Thours FROM WORKS_ON
JOIN EMPLOYEE B ON ESSN=A.ESSN
JOIN DEPARTMENT B ON A.Dnumber=B.Dnumber
GROUP BY B.Dnumber, Pnumber); --每个部门的所有职工在每个项目中的工作总时数
yjvfhpssmarco创建视图的思路是正确的,语法好像有点问题。

本回答被提问者采纳

以上是关于执行原生态的SQL(删除语句)报错了,请大神帮忙看看?的主要内容,如果未能解决你的问题,请参考以下文章

求一个linux下的shell脚本执行mysql的sql语句,但老是 不成功....大神帮忙啊...

Spring 报错,请各位大神帮忙看一下

怎么把下面的的sql语句查询出来的结果插入到一张新表中去 求大神帮忙

为啥添加了jQuery还是报错???求大神帮帮忙

clion莫名其妙的报错,请各位大神帮忙看下是啥原因

监控cactiez,监控不出图,有图不显示数据,有时图都不显示,日志报错?请大神们看一下?帮忙解决一下?