从grails域的属性获取数据库列名称

时间:2012-09-05 19:44:31

标签: hibernate grails

我正在使用我的域对象映射一堆旧表。有没有办法在Domain类中查找属性的数据库列名(反之亦然)?例如:

class Person {

String firstName
.
.
.
}

有没有办法使用firstName来取回字符串“FIRST_NAME”或“first_name”?我试过用

GrailsDomainBinder.getMapping(Person).columns

但由于某种原因,这只会给我id列。谢谢!

3 个答案:

答案 0 :(得分: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}"
            }
        }
     }
}

答案 1 :(得分:3)

好的,我认为这就是你要找的东西。鉴于以下域名

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'
}

希望这有帮助!

答案 2 :(得分:3)

我能够以一种黑客的方式得到它:

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

返回一个字符串数组,其中第一个元素应该是字段的DB列名。

使用Grails 2.3.6进行工作