java - JPA 查询问题

标签 java hibernate orm jpa

我正在尝试执行以下 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/

相关文章:

java - 是否可以让线程在其自身内部 hibernate ?

java - POI中的空指针问题

java - 使用 GROUP BY 和 RETURN ENTITY LIST 的 Hibernate 标准

java - 从 4.2.7/4.3.0.CR1 开始,Hibernate JPA OneToOne 孤立删除仍然不起作用

php - 模型中的 Kohana ORM 自定义方法

python - Django一对一反向关系DoesNotExist

java - 使用 java 使用 REST API - SSLHandshakeException

java - 从Java中的字符串中提取

java - 如何将 Wordnet 同义词与 Hibernate 搜索结合使用?

java - Hibernate 中作为复合标识符的组件