Grails GORM, как объединить устаревшие таблицы по указанным ключам - PullRequest
0 голосов
/ 02 февраля 2012

Мне нужно выполнить запрос к 2 устаревшим таблицам, но оба столбца соединения не являются первичным ключом, например, более понятным:

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 Ответ

1 голос
/ 06 февраля 2012

Эта проблема была решена путем добавления нового класса домена, сопоставленного с таблицей, в которой в качестве PK используется messageId, после чего он действует как мастер, с которого висят другие классы:

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

Надеюсь, что это поможет кому-то

...