如何用Grails createCriteria实现子查询合并为单查询?
合并Grails Criteria查询实现SQL子查询逻辑
当然可以把这两次查询合并成单次!Grails的Criteria API支持通过DetachedCriteria来实现子查询,完美对应你原始SQL里的IN子查询逻辑,不用先查一次peakfile列表再做二次过滤。
合并后的完整代码
// 定义子查询:获取符合条件的peakfile集合,对应原SQL的IN子句部分 def peakFileSubquery = new DetachedCriteria(PeResult).build { eq("conid", conid.toString()) gt("fdr", 0.05) // 这里建议用数值类型,避免字符串与数值的类型匹配问题 projections { property("peakfile") // 只投影需要的peakfile字段 } } // 主查询:直接使用子查询作为IN条件,完成分组统计 def finalResult = PeakInfo.createCriteria().list { 'in'("fname", peakFileSubquery) projections { groupProperty("transF") count("fname") } }
代码说明
DetachedCriteria是Grails用来定义独立查询的工具,这里它就对应你原始SQL中的子查询(select peakfile from pe_result where conid = 'GO:0006007' and fdr > 0.05),会在数据库层面直接执行这个子查询,而不是先把数据查出来再在内存中过滤- 主查询里的
'in'条件直接接收这个子查询对象,让数据库一次性完成关联过滤和分组统计,减少了一次数据库交互,性能更优 - 注意修正了原代码中
gt("fdr","0.05")的问题:如果fdr是数值类型(比如Double),传递字符串会导致类型转换错误,改成数值0.05更合理
这样写出来的逻辑和你原始的SQL完全等价,而且代码更紧凑,效率也更高。
内容的提问来源于stack exchange,提问作者SnehalP
相关产品推荐
相关产品推荐

