将 SQL 查询映射到 GORM 查询

Posted

技术标签:

【中文标题】将 SQL 查询映射到 GORM 查询【英文标题】:Mapping SQL query to GORM query 【发布时间】:2015-06-01 05:22:01 【问题描述】:

下面的 SQL 查询到 GORM 查询的映射是否正确?我将不胜感激任何有用的 cmets。另外,为什么 createAlias 函数中没有任何选项来指定我们希望 LEFT JOIN 发生的条件?

SQL 查询:

select tg.geck_id as geck_id, min(Fault.id) AS id, Trace.frame_number,
Module.module, Symbol.symbol, Report.email as email, Fault.version, 
Fault.short_os,Fault.fault_date as fault_date from Report, Trace, Module,  
Symbol, Fault LEFT JOIN TraceGroup16Map tgmap ON tgmap.fault_id = Fault.id 
LEFT JOIN TraceGroup16 tg ON tg.id = tgmap.group_id where Report.id = 
Fault.report_id AND Fault.id = Trace.fault_id AND Trace.symbol_id IN (select 
id from Symbol where symbol like '%mysymbol%') AND Trace.module_id IN 
(select id from Module where module like '%mymodule%') AND Trace.module_id = 
Module.id AND Trace.symbol_id = Symbol.id group by Fault.pid, Report.file 
ORDER BY Fault.fault_date DESC

GORM 查询:

def trace = Trace.createCriteria()
    def results = trace.list(max:max, offset:offset)       
        createAlias('module','mod', CriteriaSpecification.LEFT_JOIN)
        createAlias('symbol','sym', CriteriaSpecification.LEFT_JOIN)
        createAlias('fault', 'fault',CriteriaSpecification.LEFT_JOIN)
        createAlias('fault.report', 'report', CriteriaSpecification.LEFT_JOIN)
        createAlias('fault.tgmap', 'tg', CriteriaSpecification.LEFT_JOIN)
        createAlias('tg.traceGroup16','tr', CriteriaSpecification.LEFT_JOIN)        
        projections
        
            property('fault.id')
            property('tr.geckId')
            property('report.email')
            property('fault.ver')
            property('fault.shortOs')
            property('fault.faultDate')
            property('frameNumber')
            property('mod.module')
            property('sym.symbol')
            groupProperty 'fault.pid'
            groupProperty 'report.file'
        
        // Handle Unknown module case
        if (module.length() > 0 && symbol.length() > 0 && module != symbol)
        
            and
            
                like('mod.module', '%' + mymodule + '%')
                like('sym.symbol', '%' + mysymbol + '%')
            

        
        order("fault.faultDate", "desc")
    

【问题讨论】:

【参考方案1】:

验证这一点的最简单方法是打开 Hibernate 的 SQL 日志记录并检查 Hibernate 吐出的 SQL。

Reference

或者,如果您使用的是 mysql,我更喜欢的解决方案是打开查询日志并跟踪查询日志。这样做的好处是您可以在查询中看到查询参数(而不是寻找 ?s)

Reference

【讨论】:

以上是关于将 SQL 查询映射到 GORM 查询的主要内容,如果未能解决你的问题,请参考以下文章

Gorm 高级查询

gorm查询报:sql/driver: couldn‘t convert “x00“ into type bool;

如何将 spark sql 查询结果映射到对象?

如何使用 Hibernate 将 SQL 查询的结果最好地映射到非实体 Java 对象?

使用 Spring Data JPA 将 sql 查询的结果映射到 pojo

如何使用 Entity Framework Core 5.0 将复杂 SQL 查询的结果行映射到自定义 DTO?