4

多数のレガシー テーブルをドメイン オブジェクトにマッピングしています。ドメイン クラスのプロパティのデータベース カラム名を検索する方法はありますか (またはその逆)? 例えば:

class Person {

String firstName
.
.
.
}

文字列「FIRST_NAME」または「first_name」を取得するために firstName を使用する方法はありますか? 私は使用しようとしました

GrailsDomainBinder.getMapping(Person).columns

しかし、それは何らかの理由で私に id 列を与えるだけです。ありがとう!

4

3 に答える 3

8

このコードを一緒に放り投げただけなので、スタイルで私を打ち負かさないでください。:-)

以下に示すように、あなたのテストアクションメソッドにドロップしてPersonController、インポートステートメントを追加してみてください。sessionFactory

import org.hibernate.persister.entity.AbstractEntityPersister
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass

class PersonController {

    // This should get injected by Grails automatically
    def sessionFactory

    ....
    def myTestAction() {
        def domainClazz = grailsApplication.getClassForName("com.test.Person")

        def clazzMetadata = sessionFactory.getClassMetadata(domainClazz)
        def AbstractEntityPersister abstractEntityPersister = (AbstractEntityPersister) clazzMetadata
        def grailsDomainClazz = new DefaultGrailsDomainClass(domainClazz)

        def grailsDomainClazzProperties = grailsDomainClazz.getProperties()

        grailsDomainClazzProperties.each() {
            println "Property Name: ${it.name}"
            abstractEntityPersister.getPropertyColumnNames(it.name).each() {
                println "DB Column: ${it}"
            }
        }
     }
}
于 2012-09-05T21:05:08.080 に答える
4

わかりました、これがあなたが探しているものだと思います。次のドメインが与えられた場合

class Company {    
  String name
  String logoUrl

  static mapping = {
    table 'people'
    name column: 'my_name'
    logoUrl column:  'lo_go_url'
  }
}

次のコマンドでドメイン データを取得できます。

def result = GrailsDomainBinder.getMapping(Company).columns
println result['logoUrl'].column //prints 'lo_go_url'

次のクロージャーを使用して、すべての列名を出力することもできます。

result.each{ key, val -> // The key is the attribute name in the class (i.e. name, logoUrl)
  PropertyConfig prop = val // This is not needed, but I wanted to show the type being used. You could just call val.column below.
  println prop.column // This would print out 'my_name', 'lo_go_url'
}

お役に立てれば!

于 2012-09-05T21:08:14.977 に答える
3

私は少しハックな方法でそれを得ることができました:

 def dbColumnNames = sessionFactory.getClassMetadata(clazz).propertyMapping.getColumnNames(fieldName)

これは、最初の要素がフィールドの DB 列名である文字列の配列を返します。

Grails 2.3.6 で動作します

于 2015-05-13T13:25:49.723 に答える