【发布时间】:2019-08-23 20:13:17
【问题描述】:
当尝试使用通用 executeUpdate(query) 方法更新我的 java 对象时,grails 抛出 NullPointer 异常,说明:
意外的 AST 节点:.
我的对象关系结构如下:
Class Product implements Serializable {
String name
Integer priority
static belongsTo = [owner: Owner]
static mapping = {owner fetch: 'join'}
}
Class Owner implements Serializable {
String name
Contract contract
static hasMany = [product: Product]
}
Class Contract implements Serializable {
Boolean isActive
}
我已成功在我的数据库上运行以下 SQL 请求:
UPDATE product SET priority = IF(
(SELECT co.is_active FROM owner o
JOIN contract co
ON co.id = o.contract_id
WHERE o.id = product.dealership_id) = 1
, 10, 0);
但是,尝试在 grails 中运行以下代码会引发 NPE:
def hqlQuery = 'update Product p set p.priority = (case when p.owner.contract.isActive then 10 else 0 end)'
def result = Product.executeUpdate(hqlQuery)
这是为什么呢?我的类映射或 HQL 请求中是否缺少某些内容?
补充说明:
- 我正在使用 grails 2.3.4
- 在我的 grails 代码中访问信息
p.owner.contract.isActive没有问题 - 产品总有所有者
- 有些业主根本没有合同(字段为空)
- 所有者最多有 1 个有效合同。但是,在数据库中,多个旧合同可以引用同一个所有者。
【问题讨论】:
-
stackoverflow.com/a/25712491/755637 在这种情况下你没有
end..case when something then 1 else 2 endHQL 在某些情况下使用 case 语句存在一些问题。不确定这是否是一个 - 上面的那一刻看起来不正确 -
@Vahid 抱歉,我在为我的问题创建示例时犯了一个错误。我的真实代码中确实有
end -
认为您在该布尔检查中缺少
is true`(当 p.owner.contract.isActive 为真时,则为 10 else 0 end)` 如果这不起作用,请尝试update Product p join p.ower o left join o.contract c set p.priority = (case when coalesce(c.isActive,false) is true then 10 else 0 end)HQL不是 groovy :) -
@Vahid 显然
update期望在join之前有一个set指令,并将join指令推到查询后面会引发另一个异常 -
标签: java grails hql grails-orm