Gosu多表关联查询运行时抛出IllegalArgumentException问题排查
Gosu关联查询报错问题排查
问题场景
我尝试关联Claim与Message表,筛选出满足以下条件的Claim对象:
Claim.id = Message.claimMessage.DestinationID = 66Message.ErrorDescription = "errordescription"
使用的Gosu查询代码:
var claims = Query.make(Claim).join(Message#Claim).compare(Message#DestinationID, Relop.Equals, 66).compare(Message#ErrorDescription, Relop.Equals, "errordescription").select()
运行时抛出错误:
java.lang.IllegalArgumentException: Value gw.lang.reflect.features.PropertyReference@563f761c (type gw.lang.reflect.features.PropertyReference) is not compatible with property entity.Message.ID (gw.pl.persistence.core.Key)
错误原因
join(Message#Claim)的写法错误,搞反了关联方向:
Message#Claim是从Message指向Claim的属性,但当前查询的主实体是Claim,join方法需要指定的是从Claim指向Message的关联属性,或者显式声明关联匹配字段,否则会导致属性类型不匹配的报错。
修正方案
方案1:利用Claim实体的关联属性(推荐)
如果Claim实体中已经定义了与Message的关联关系(比如一对多的Messages属性),直接通过该属性关联:
var claims = Query.make(Claim) .join(Claim#Messages) .compare(Message#DestinationID, Relop.Equals, 66) .compare(Message#ErrorDescription, Relop.Equals, "errordescription") .select()
方案2:显式指定关联字段
如果没有现成的关联属性,直接声明关联双方的匹配字段:
var claims = Query.make(Claim) .join(Message, Claim#ID, Message#Claim) .compare(Message#DestinationID, Relop.Equals, 66) .compare(Message#ErrorDescription, Relop.Equals, "errordescription") .select()
以上两种写法都能正确建立Claim与Message的关联,满足查询逻辑。
内容的提问来源于stack exchange,提问作者KJ21
相关产品推荐
相关产品推荐

