обновления Account_Phone набор is_Primary_Phone = (случай, когда account_id = 10 и phone_id = 20, то is_Primary_Phone = истина еще is_Primary_Phone = ложный конец)Как сделать это запустить запрос в HQL
ответ
Синтаксис 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')])
Вы можете следить за два способами:
Первый способ: инкапсулировать ваш запрос в запрос ocject (из спящего режима) и использовать метод execute. (Account_Phone должен быть классом, сопоставленным с реальной таблицей)
Второй способ: применить логику к набору вашего класса, а затем использовать session.merge (или session.saveOrUpdate) для обновления вашей БД.
в 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])
Я класса, но компилятор выдаст ошибку на «потом» мир в 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')]) –
org. hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен: = рядом строка 1, столбец 118 [обновление com.express.trade.AccountPhone set isPrimaryPhone = (случай, когда (account_id =? и phone_id =?), тогда isPrimaryPhone = true else isPrimaryPhone = ложный конец) где account_id =?] –
Первое: вместо true/false try с 1/0; second: Вы заменили свои параметры? Попробуйте без параметров (поместите константы в свой запрос, а затем попробуйте с параметрами) –