2011-01-10 5 views
1

У меня есть очень простой именованный запрос на JPA (TopLink):TopLink префиксы стол с tl_ во время операции обновления

UPDATE Server s SET s.isECM = 0 

я не несу о кэше или действительности уже предустановленными лиц. Но соединение с базой данных выполняется из ограниченной учетной записи (только INSERT/UPDATE/DELETE). Оно оказалось, что TopLink на этом запрос выполняется (и не так TL_Server не существует) очень странный SQL:

INSERT INTO TL_Server (elementId, IsECM) 
    SELECT t0.ElementId, ? 
    FROM Element t0, Server t1 
    WHERE ((t1.elementId = t0.ElementId) AND (t0.elementType = ?)) 

bind => [0, Server] 

Что это? Как просто UPDATE появляется INSERT? Зачем нужны запросы TL_?

ответ

2

TL_Server - это временная таблица. Поскольку запрос UpdateAll определяется как сложный, необходимо использовать таблицу temp. Я предполагаю, что он определен как сложный, потому что класс имеет несколько таблиц, поэтому они должны быть объединены, что невозможно сделать при простом обновлении.

Если у вас класс, просто была одна таблица, тогда простое обновление было бы выполнено.

Если это не удается, это проблема с поддержкой базы данных платформы базы данных. Убедитесь, что вы правильно настроили «toplink.target-database». Какую базу данных вы используете?

Возможно, вы используете очень старую версию TopLink Essentials? Поддержка UpdateAll значительно улучшилась в последних версиях EclipseLink, вы можете рассмотреть возможность обновления.

Если вы не можете заставить его работать с использованием TopLink Essentials, вы всегда можете просто использовать собственный SQL-запрос вместо JPQL.

+0

Для меня ясно, почему toplink не удалось (см. Выше), поскольку учетная запись базы данных не имеет права создавать таблицы, поэтому ant TL_ не удастся). Мой вопрос заключается в любом способе сказать, что toplink не использует временные таблицы вообще? Или сделайте некоторый намек на JPA, что это действительно очень простой запрос. В любом случае спасибо (+1) за идею с собственным запросом. – Dewfy