【问题标题】:Update Query working in MySQL workbench but not in Java code更新查询在 MySQL 工作台中工作,但不在 Java 代码中
【发布时间】:2018-09-20 23:59:20
【问题描述】:

我创建了一个查询,我想在同一个表中使用内部查询更新某些列。并且查询在 MySQL 工作台中运行良好,但如果我在 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.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));

        }

    }

有人可以帮忙吗? 提前致谢!

【问题讨论】:

  • 你能在你使用的代码中添加Java吗?
  • 可以试试不使用 Inner 吗?让它只是加入,默认情况下它是内部的。在我看来,解析查询时 java mysql 驱动程序导致了问题
  • 如何执行查询?是不是 JPQL,因为如果是这种情况,那么它不支持加入更新

标签: java mysql mysql-workbench mysql-error-1064


【解决方案1】:

从您的代码getCurrentSession().createQuery(saveQuery.toString()); 我猜您正在使用一些 JPA 实现(spring 或其他东西?并且在 JPQL 中不提供加入更新(https://docs.oracle.com/javaee/6/tutorial/doc/bnbtl.html#bnbud

因此,您可以尝试将其作为本机 mysql 查询发送。我不确定这样做的确切方法是什么,因为我现在没有这样的项目,但我相信它是这样的: getCurrentSession().createNativeQuery(saveQuery.toString()); 然后它应该可以工作,但它有点违背使用 JPA 的目的:)

所以我想你应该像上面建议的那样重新处理查询:

update table1 set fromUserId=305, toUserId=306 where time = (SELECT MAX(time)  FROM table1 WHERE id = 1);

【讨论】:

  • 谢谢,@Veselin Davidov,你的回答不是我想要的,但它给了我一些提示。
【解决方案2】:

你可以试试这个:

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))

【讨论】:

  • 不,那是行不通的。我以前也试过。它给了我类似“错误代码:1093。您不能在 FROM 子句中指定目标表 't1' 进行更新”的错误
  • 删除 t1 的东西
猜你喜欢
  • 2016-03-02
  • 2014-09-29
  • 1970-01-01
  • 2015-06-03
  • 2018-07-19
  • 2018-06-19
  • 2017-05-19
  • 2015-06-08
  • 2015-11-06
相关资源
最近更新 更多