2015-11-18 4 views

ответ

1

Синтаксис CASE: CASE {operand} WHEN {test_value} THEN {match_result} ELSE {miss_result} END См. документацию Hibernate HQL.

Вы также можете сделать: CASE WHEN {test_value} THEN {match_result} ELSE {miss_result} END

Что вы не может сделать, это присвоить значение в пределах {match_result} или {miss_result}: ... THEN isPrimaryPhone = true ELSE isPrimaryPhone = false END

Booleans обрабатываются по-разному другой базе данных системы. Но в целом выражение СЛУЧАЙ ваш запрос был бы: CASE WHEN account_id = :account AND phone_id = :phone THEN 1 ELSE 0 END

Вот полный пример:

def hql = """ 
UPDATE AccountPhone 
SET isPrimaryPhone = CASE WHEN account_id = :account AND phone_id = :phone THEN 1 ELSE 0 END 
WHERE account_id = :account 
""" 

AccountPhone.executeUpdate(hql, [account: account.id, phone: params.long('phoneNo')]) 
0

Вы можете следить за два способами:

Первый способ: инкапсулировать ваш запрос в запрос ocject (из спящего режима) и использовать метод execute. (Account_Phone должен быть классом, сопоставленным с реальной таблицей)

Второй способ: применить логику к набору вашего класса, а затем использовать session.merge (или session.saveOrUpdate) для обновления вашей БД.

+0

Я класса, но компилятор выдаст ошибку на «потом» мир в HQL запрос в качестве последующих AccountPhone.executeUpdate ("обновление AccountPhone set isPrimaryPhone = (Case when (account_id =? и phone_id =?) then isPrimaryPhone = true else isPrimaryPhone = false end) где account_id =? ", [account.id, params? .long ('phoneNo')]) –

+0

org. hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: = рядом строка 1, столбец 118 [обновление com.express.trade.AccountPhone set isPrimaryPhone = (случай, когда (account_id =? и phone_id =?), тогда isPrimaryPhone = true else isPrimaryPhone = ложный конец) где account_id =?] –

+0

Первое: вместо true/false try с 1/0; second: Вы заменили свои параметры? Попробуйте без параметров (поместите константы в свой запрос, а затем попробуйте с параметрами) –

0

в Grails 3.0.9 я добавить это к запросу

AccountPhone.executeUpdate ("обновление AccountPhone ара установить ap.isPrimaryPhone = случай, когда (account_id =? И phone_id =?) THEN ELSE истинный ложные end, где account_id =? ", [account.id, params? .long ('phoneNo'), account.id])