如何基于关联实体计算属性对Gosu查询结果排序?
如何在Gosu Query Builder中基于关联实体属性使用计算函数排序
要解决你遇到的问题,核心是正确获取关联实体的列引用,同时安全绑定参数避免SQL注入。以下是具体的解决方案和修正后的代码:
关键修正点
通过Join对象获取关联实体的列引用
当你通过queryExposure.join(Exposure#Claim)得到claimTable(QueryJoin<Claim>类型)后,直接调用claimTable.getColumnRef(Claim#LossDate)即可获取Claim实体的LossDate属性对应的数据库列引用——因为claimTable的根实体是Claim,无需额外的前缀。安全绑定日期参数
不要用字符串插值${asOfDate}拼接SQL,而是通过DBFunction.Expr的参数列表传入asOfDate,让Query Builder自动处理参数绑定,既安全又能适配不同数据库的日期格式。
修正后的完整代码
function loadExposures(asOfDate : Date, policyNumber : String) : IQueryBeanResult<Exposure> { var queryExposure = Query.make(Exposure) var claimTable = queryExposure.join(Exposure#Claim) var policyTable = claimTable.join(Claim#Policy) policyTable.compare(Policy#PolicyNumber, Relop.Equals, policyNumber) var selectExposure = queryExposure.select() // 正确获取Claim.LossDate的列引用,并安全绑定asOfDate参数 var lossDateColumn = claimTable.getColumnRef(Claim#LossDate) selectExposure.orderBy(QuerySelectColumns.dbFunction( DBFunction.Expr("DATEDIFF('days', ?, ?)", lossDateColumn, asOfDate) )) selectExposure.thenBy(QuerySelectColumns.path(Paths.make(Exposure#Claim, Claim#ClaimNumber))) selectExposure.thenBy(QuerySelectColumns.path(Paths.make(Exposure#ClaimOrder))) return selectExposure }
原代码问题解析
queryExposure.getColumnRef("Claim.LossDate")无效:queryExposure的根实体是Exposure,它的getColumnRef方法只能直接引用Exposure自身的属性,无法通过字符串路径跨实体获取关联属性。claimTable.getColumnRef("LossDate")无效:问题出在使用字符串"LossDate"而非强类型的属性引用Claim#LossDate。Gosu Query Builder优先推荐强类型引用,既能在编译期检查错误,也能自动映射到正确的数据库列名;若使用字符串,需确保与数据库列名完全一致,容错性更低。
内容的提问来源于stack exchange,提问作者Kamil Kurkiewicz
相关产品推荐
相关产品推荐

