更新Account_Phone设置is_Primary_Phone =(当account_id = 10且phone_id = 20然后is_Primary_Phone = true,否则is_Primary_Phone = false结束时的情况)
答案 0 :(得分: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
不同的数据库系统对布尔值的处理方式不同。但通常您的查询CASE表达式为: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')])
答案 1 :(得分:0)
您可以采用以下两种方式:
第一种方法:将查询封装在一个ocject Query(hibernate)中并使用execute方法。 (Account_Phone必须是使用真实表格映射的类)
第二种方法:在一组类上应用逻辑,然后使用session.merge(或session.saveOrUpdate)更新数据库。
答案 2 :(得分:0)
在Grails 3.0.9中,我将这个添加到查询
AccountPhone.executeUpdate("更新AccountPhone ap set ap.isPrimaryPhone = case when(account_id =?and phone_id =?) THEN true ELSE false end where account_id =?" [account.id,则params。长?(' PHONENO&#39),account.id])