【问题标题】:Update Query with JPA issue使用 JPA 问题更新查询
【发布时间】:2025-12-09 06:35:02
【问题描述】:

我有这个功能

public void updateAnimal(int idToModify, String name, String type, int age) {
    entityManager.getTransaction().begin();
    Query query = entityManager.createQuery(
            "UPDATE PetHospital.Animal SET animalName=:name, animalType=:type, animalAge=:age WHERE idAnimal=:idToModify");
    query.setParameter("name", name);
    query.setParameter("type", type);
    query.setParameter("age", age);
    query.setParameter("idToModify", idToModify);
    query.executeUpdate();
    entityManager.getTransaction().commit();
}

我得到了这个错误

线程“main”中的异常 java.lang.IllegalArgumentException:在 EntityManager 中创建查询时发生异常:异常 说明:语法错误解析 [UPDATE PetHospital.Animal SET animalName=:name, animalType=:type, animalAge=:age WHERE idAnimal=:idToModify]。 [30, 40] 路径表达式必须以 识别变量。 [50, 60] 路径表达式必须以 识别变量。 [70, 79] 路径表达式必须以 识别变量。 在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1605) 在 util.DatabaseUtil.updateAnimal(DatabaseUtil.java:84) 在 main.Main.main(Main.java:32) 引起:异常 [EclipseLink-0] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.JPQLException 异常 说明:语法错误解析 [UPDATE PetHospital.Animal SET animalName=:name, animalType=:type, animalAge=:age WHERE idAnimal=:idToModify]。 [30, 40] 路径表达式必须以 识别变量。 [50, 60] 路径表达式必须以 识别变量。 [70, 79] 路径表达式必须以 识别变量。 在 org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155) 在 org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334) 在 org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278) 在 org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163) 在 org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142) 在 org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116) 在 org.eclipse.persistence.internal.jpa.EJBQueryImpl.(EJBQueryImpl.java:102) 在 org.eclipse.persistence.internal.jpa.EJBQueryImpl.(EJBQueryImpl.java:86) 在 org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1603) ... 2 更多

当我使用该参数在 main 中调用该函数时,我希望用参数获取的新值更新 SQL 行。

【问题讨论】:

  • 也许UPDATE PetHospital SET PetHospital.Animal animalName=:name
  • @K.Nicholas PetHospital 是模式,Animal 是表。现在我得到:内部异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行错误代码:1064 的 ':name, animalType=:type, animalAge=:age WHERE idAnimal=:idToModify' 附近使用正确的语法。我认为这与参数。

标签: jpa


【解决方案1】:

错误“路径表达式必须以标识变量开头。”描述了“路径”的问题。路径是标识字段的点表示法。参见,例如,Paths and Types in JPQL and Criteria API

所以,你可能需要说

UPDATE PetHospital.Animal a SET a.animalName=:name, a.animalType=:type, a.animalAge=:age WHERE a.idAnimal=:idToModify

【讨论】:

  • 是的,现在我得到:[76, 87] 状态字段无法解析。 [101, 111] 状态字段路径“a.idAnimal”无法解析为有效类型。
  • 您需要更新您的问题以包含实体,以便我们验证您的字段名称。