我正在尝试执行以下 JPA 查询:
public static final String UPDATE_INVENTORY_CUSTOMER_FOR_AMS_MAPPING = "UPDATE Inventory inventory SET"
+ " inventory.customer.id = :" + DataAccessConstants.PARAM_CUSTOMER_ID
+ " ,inventory.lastUpdateUserId = :" + DataAccessConstants.PARAM_USER_ID
+ " where inventory.amsConsignorName = :" + DataAccessConstants.PARAM_AMS_CONSIGNOR_NAME
+ " and inventory.amsConsignorOrgCd = :" + DataAccessConstants.PARAM_AMS_CONSIGNOR_ORG_CD
+ " and inventory.amsConsignorTypeName = :" + DataAccessConstants.PARAM_AMS_CONSIGNOR_TYPE
+ " and inventory.status.code in (:" + DataAccessConstants.PARAM_STATUS + ")";
但它看到以下内容:
update ATL_INVENTORY, set CONSIGNOR_ID=?, LAST_UPDATE_USER_ID=? where AMS_CONSIGNOR_NAME=? and AMS_CONSIGNOR_ORG_CD=? and AMS_CONSIGNOR_TYPE_NAME=? and (CODE in (? , ? , ? , ?))
关于表名后面为什么有逗号的任何想法?
解决方案
我必须将原始查询更改为以下内容:
update Inventory inv set "
+ "inv.customer.id = :" + DataAccessConstants.PARAM_CUSTOMER_ID + " "
+ "where inv.amsConsignorName =:" + DataAccessConstants.PARAM_AMS_CONSIGNOR_NAME + " "
+ "and inv.amsConsignorOrgCd =:" + DataAccessConstants.PARAM_AMS_CONSIGNOR_ORG_CD + " "
+ "and inv.amsConsignorTypeName =:" + DataAccessConstants.PARAM_AMS_CONSIGNOR_TYPE + " "
+ "and exists(select 1 from Code code where inv.status = code and code.code in (:" + DataAccessConstants.PARAM_STATUS + "))
然后产生了这个:
update ATL_INVENTORY set CONSIGNOR_ID=? where AMS_CONSIGNOR_NAME=? and AMS_CONSIGNOR_ORG_CD=? and AMS_CONSIGNOR_TYPE_NAME=? and (exists (select 1 from ATL_CODE code1_ where ATL_INVENTORY.STATUS=CODE_ID and (code1_.CODE in (? , ? , ? , ?))))
基于此处的说明:Incorrect SQL generated for JPA QL Update statement involving multiple entities
最佳答案
您的查询代码为 UPDATE Inventory inventory SET
,但生成的 SQL 显示为 update ATL_INVENTORY, set
。为什么文字 SQL 字符串不是您编码的内容?当我遇到这样的谜团时,通常是由于假设正在做一件事而实际上正在做另一件事。
这表明您编写的 SQL 并未按照您假设的方式用于生成该 SQL。查看此查询可能来自何处。我敢打赌真正的来源中有一个错位的逗号。
您使用的是哪种 JPA 实现?如果我对一个错误的假设不正确,它表示实现中存在错误。你以前用过吗? UPDATE 成功了吗?如果是,它肯定埋在您的代码库中的某个地方。
你有一个接口(interface),里面有一堆常量。就个人而言,我不喜欢那样的设计。这是一个anti-pattern with a name .
关于java - JPA 查询问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2704914/