2012-02-02 36 views
0

我需要运行2个遗留表的查询,但无论是连接列不是主键,通过实例更加清晰:的Grails GORM如何加入原有表上指定的键

的2一到一个域类:

class DocumentStatus { 
    String id 
    String messageID 

    static hasOne = [activity: Activity] 

    static constraints = { 
     activity unique: true 
    } 

    static mapping = { 
     datasource 'messages' 
     table 'DocumentStatus' 
     cache usage: 'read-only' 
     version false 
     id column: 'UniqueID', generator: 'assigned' 

     messageID column: 'MessageID', insertable: false, updateable: false 
     activity column: 'MessageID', ignoreNotFound: true, cache: true, /*lazy: false, */fetch: 'join' 
    } 
} 

class Activity { 

    String id 
    String messageId 

    DocumentStatus documentStatus 

    static belongsTo = [DocumentStatus] 

    static mapping = { 
     datasource 'messages' 
     version false 
     cache usage: 'read-only' 
     table 'Activity' 

     id column: 'aid', generator: 'assigned' 

     messageId column: 'messageid', insertable: false, updateable: false 

     documentStatus column: 'messageid', cache: true 
    } 

    static constraints = { 
     documentStatus unique: true 
    } 
} 

的SQL运行是(这里只显示重要组成部分):

"inner join activity activity_a1_ on this_.uniqueid=activity_a1_.messageid " 

但我需要的是将DocumentStatus又名“this_”上的连接列更改为“messageId”。

where子句主要是:

def query = DocumentStatus.where { 
    dateTime >= dateFrom && dateTime <= dateTo && 
     status in docStatusList 
} 

if (buyerId) { 
    query = query.where { 
     activity.senderId == buyerId 
    } 
} 
def results = query.list(sort: "dateTime", max: 100) 

我已经试过各种组合,但不能得到比较是messageId上的连接两侧。

回答

1

这通过将映射到该已MESSAGEID作为其PK表中的新的域类解决,这接着充当该其他类从挂所述主:

class Content { 
    String id 
    String messageID 

    static hasMany = [docStatus: DocumentStatus, activity: Activity] 

    static mapping = { 
    datasource 'messages' // If using multiple sources, specify 
    table 'Content' // Table to map to 
    cache usage: 'read-only' // If read-only 
    version false // no optimistic locking in these tables 
    sort dateTime: "desc" 

    // Map the ID column 
    id column: 'MessageID', generator: 'assigned' 
    // Map all other columns 

    messageID column: 'MessageID', insertable: false, updateable: false 

    docStatus column: 'MessageID', ignoreNotFound: true, cache: true, fetch: 'join' 
    activity column: 'MessageID', ignoreNotFound: true, cache: true, fetch: 'join' 
} 

}

我我仍然不确定为什么最初的问题在那里(也许这个用户错误:)),当然我可以加入DomainA.FK = DomainB.FK。到底这种方法对于我来说,实际上是一个更好的解决方案通过反正用的PK类开始,上DomainA.PK = DomainB.FK

希望帮助别人

分支出来