如何使此查询在HQL中运行

时间:2015-11-18 09:33:02

标签: grails hql

更新Account_Phone设置is_Primary_Phone =(当account_id = 10且phone_id = 20然后is_Primary_Phone = true,否则is_Primary_Phone = false结束时的情况)

3 个答案:

答案 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])