Проблема с запросом JPA - PullRequest
       16

Проблема с запросом JPA

2 голосов
/ 24 апреля 2010

Я пытаюсь выполнить следующий запрос 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 (? , ? , ? , ?))))

Основано на пояснении: Неправильный SQL, сгенерированный для оператора обновления JPL QL с участием нескольких сущностей

Ответы [ 2 ]

1 голос
/ 25 апреля 2010

Ошибка в поставщике JPA, на мой взгляд, очень маловероятна, поэтому, как сказал @duffymo, вы уверены, что используете правильную константу, что код или, возможно, зависимости актуальны? Я бы копал в этом направлении.

При этом мне действительно интересно, почему вы не используете именованных запросов (которые большую часть времени предварительно компилируются реализацией постоянства во время развертывания), либо в коде Java, либо в мета файлы отображения данных (самое интересное в том, что люди не находят, что запросы EJB-QL, экстернализованные в XML, очень управляемы в EJB 2.x, поэтому аннотация JPA @NamedQuery).

1 голос
/ 24 апреля 2010

Ваш запрос имеет код UPDATE Inventory inventory SET, но сгенерированный SQL говорит update ATL_INVENTORY, set. Почему буквенная строка SQL не то, что вы кодировали? Когда я сталкиваюсь с такими тайнами, они обычно вызваны предположением, что одна вещь выполняется, когда фактически другая находится в игре.

Это говорит о том, что кодированный вами SQL не используется для генерации этого SQL, как вы предполагаете. Посмотрите, откуда еще этот запрос может прийти. Могу поспорить, что в настоящем источнике есть запятая.

Какую реализацию JPA вы используете? Если я ошибаюсь из-за неверного предположения, это говорит о том, что в реализации есть ошибка. Вы использовали это раньше? Был ли у вас успех с обновлением? Если да, он определенно похоронен где-то в вашей кодовой базе.

У вас есть интерфейс с кучей констант в нем. Лично мне плевать на такой дизайн. Это анти-паттерн с именем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...