2010-04-24 3 views
1

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

+0

Проблема была устранена по следующей ссылке: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2408 Похоже, я пропустил эту часть в документации, когда создал свой запрос. – boyd4715

ответ

1

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

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

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

У вас есть интерфейс с кучей констант в нем. Лично мне не нравится такой дизайн. Это anti-pattern with a name.

+0

Спасибо - на вопрос «у вас есть интерфейс с кучей констант в нем», это неверно. Просто простой класс со статическими именованными запросами. – boyd4715

+0

Мне тоже не нравится. Почему бы вам не поместить константы в класс, который их использует? – duffymo

+0

На этом сайте было предложено, чтобы у вас было много именованных запросов, которые вы поместили в файл констант отдельно. Затем pojo просто ссылается на них. Таким образом, с константами, никаких шансов на орфографию, и я думаю, что он чище. – boyd4715

1

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

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

+0

Как указано, мы используем @NameQuery. Просто случается, что я поместил именованные запросы в отдельный файл в том же пакете. У нас есть уровень обслуживания данных, который позволяет передавать эти запросы имен на уровень данных. Использование констант для именованных запросов предотвращает любые проблемы для разработчиков бизнес-уровня, по которым запрос запрашивает доступ. – boyd4715

Смежные вопросы