2017-01-11 3 views
-1
@NamedQuery(name="getHeightByTaskId",query="select otherheight from BTSTaskDetail where id=2 for update") 

ОшибкаОшибка в спящем режиме по имени запрос

ОШИБКИ internal.SessionFactoryImpl - HHH000177: Ошибка в имени запрос: getHeightByTaskId org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданных лексем: для ближнего строка 1, столбец 79 [выберите otherheight из com.inn.siteforge2.bts.model.BTSTaskDetail, где ID = 2 для обновления]

ответ

0

for update не является действительным J PQL ключевое слово

Для фиксации используют один из стандартных способов: https://en.wikibooks.org/wiki/Java_Persistence/Locking

+0

Что является альтернативой для выбора для обновления в спящем режиме –

+0

Выберите всю сущность, внесите изменения и вызовите merge() –

+0

@ Значок AnkitPatwa отвечает как полезный –

0
@NamedQuery(name = "BTSTaskDetail.otherheight", query = "SELECT c FROM BTSTaskDetail c WHERE c.otherheight = :otherheight"), 

Теперь обновить объект и сохранить их.

+0

Я знаю, что это сработает. Но фактическая проблема состоит в том, что несколько потоков - это значение высоты приращения в одно и то же время. Например, в одно время значение высоты равно 4 и 5 потокам одновременно считывается с db и увеличивает его на единицу, а обновление в db - результат 5, который должен быть равен 9. Эта проблема решается путем выбора запроса обновления, который отлично работает в mysql. Когда мы используем select для обновления, он блокирует определенную строку, когда мы читаем данные и разблокируем их, когда данные совершаются. –

+0

@AnkitPatwa, какую блокировку вы используете? –

+0

Я использую hibernate framework и управление транзакциями весной. Hibernate внутренне управляет блокировкой. –

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