更新查询在MySQL工作台中工作,但不在Java代码中工作
我创建了一个查询,希望在其中使用同一表中的内部查询更新某些列。查询在MySQL workbench中运行良好,但如果我在java中使用相同的查询,则会出现如下错误更新查询在MySQL工作台中工作,但不在Java代码中工作,java,mysql,mysql-workbench,mysql-error-1064,Java,Mysql,Mysql Workbench,Mysql Error 1064,我创建了一个查询,希望在其中使用同一表中的内部查询更新某些列。查询在MySQL workbench中运行良好,但如果我在java中使用相同的查询,则会出现如下错误 expecting "set", found 'INNER' 这是我创建的查询 UPDATE table1 t1 INNER JOIN (SELECT MAX(time) FROM table1 WHERE id = 1) t2 ON t1.time = t2.time SET t1.fro
expecting "set", found 'INNER'
这是我创建的查询
UPDATE table1 t1
INNER JOIN (SELECT MAX(time)
FROM table1 WHERE id = 1) t2
ON t1.time = t2.time
SET t1.fromUserId=305,
t1.toUserId=306,
t1.type='Positive',
t1.subcategoryId=508,
t1.isDeleted=false,
t1.isNotify=true;
Java代码
@Override
public void methodName(DTOClass dtoClass) throws DatabaseException {
logger.info("*******************In save-update ******************");
StringBuilder saveQuery = new StringBuilder();
try {
saveQuery.append(" UPDATE table1 t1 INNER JOIN (SELECT MAX(time) FROM table1 ");
saveQuery.append(" WHERE id = :addedBy) t2 ON t1.time = t2.time ");
saveQuery.append(" SET t1.fromUserId=:fromUserId, t1.toUserId=:toUserId, t1.type=:type, ");
saveQuery.append( " t1.subcategoryId=:subcategoryId, t1.isDeleted=false, t1.isNotify=:isNotify ");
logger.info(saveQuery.toString());
Query query = getCurrentSession().createQuery(saveQuery.toString());
query.setParameter("addedBy", dtoClass.getAddedBy());
query.setParameter("fromUserId", dtoClass.getFromUserId());
query.setParameter("toUserId", dtoClass.getToUserId());
query.setParameter("type", dtoClass.getType());
query.setParameter("subcategoryId", dtoClass.getSubcategoryId());
query.setParameter("isNotify", dtoClass.getIsNotify());
query.executeUpdate();
} catch (Exception exception) {
logger.error(exception.getMessage(), exception);
throw new DatabaseException(ResourceManager.getProperty(EXCEPTION_DAO_USER));
}
}
有人能帮忙吗。
提前谢谢 你能试试这个吗:
update A
set A.fromUserId=305,
A.toUserId=306,
A.type='Positive',
A.subcategoryId=508,
A.isDeleted=false,
A.isNotify=true
from table1 A
inner join (SELECT MAX(time) as bTime FROM table1 WHERE id = 1) B
on (A.time = (B.bTime))
从您的代码
getCurrentSession().createQuery(saveQuery.toString())代码>我猜您正在使用一些JPA实现(spring或其他什么?在JPQL()中没有join-in更新)
因此,您可以尝试将其作为本机mysql查询发送。我不确定确切的方法是什么,因为我现在没有这样的项目,但我相信它类似于:
getCurrentSession().createNativeQuery(saveQuery.toString());
那么它应该可以工作,但它有点挫败了使用JPA的目的:)
因此,我想您应该像上面建议的那样重新编写查询:
update table1 set fromUserId=305, toUserId=306 where time = (SELECT MAX(time) FROM table1 WHERE id = 1);
你能把Java添加到你使用的代码中吗?你能在没有内部代码的情况下尝试吗?让它只是连接,默认情况下它是内部的。在我看来,java mysql驱动程序在解析查询时造成了问题。您如何执行查询?是JPQL吗?因为如果是这种情况,那么它不支持在updateNo中加入,而updateNo不起作用。我以前也试过。它给了我类似于“错误代码:1093.您不能在FROM子句中指定更新的目标表't1'”的错误。请删除t1。谢谢,@Veselin Davidov,您的回答不是我想要的,但它给了我一些提示。