Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 从grails域的属性获取数据库列名_Hibernate_Grails - Fatal编程技术网

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

Hibernate 从grails域的属性获取数据库列名,hibernate,grails,Hibernate,Grails,我正在用我的域对象映射一堆遗留表。是否有方法在域类中查找属性的数据库列名(反之亦然)?例如: class Person { String firstName . . . } 有没有一种方法可以使用firstName返回字符串“FIRST\u NAME”或“FIRST\u NAME”?我试着用 GrailsDomainBinder.getMapping(Person).columns 但这只是出于某种原因给了我id列。谢谢 我刚刚拼凑了这段代码,所以请不要在风格上批评我。:-) 尝试将其放入

我正在用我的域对象映射一堆遗留表。是否有方法在域类中查找属性的数据库列名(反之亦然)?例如:

class Person {

String firstName
.
.
.
}
有没有一种方法可以使用firstName返回字符串“FIRST\u NAME”或“FIRST\u NAME”?我试着用

GrailsDomainBinder.getMapping(Person).columns

但这只是出于某种原因给了我id列。谢谢

我刚刚拼凑了这段代码,所以请不要在风格上批评我。:-)

尝试将其放入
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}"
            }
        }
     }
}

好吧,我想这就是你要找的。给定以下域

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

希望这有帮助

我能以一种有点粗俗的方式得到它:

 def dbColumnNames = sessionFactory.getClassMetadata(clazz).propertyMapping.getColumnNames(fieldName)
这将返回一个字符串数组,其中第一个元素应为字段的DB列名


在Grails2.3.6下工作

您的类中定义了映射吗<如果未定义自定义映射,则code>GrailsDomainBinder.getMapping(Person)返回null。如果不使用自定义映射,则您知道基于类名的表名。是的,定义了映射。我第一次把标题搞砸了……我实际上是在从映射到的属性中查找列名。关键是,我从程序的不同部分获得了实际的列名及其值,我需要将它们映射到正确的域对象以持久化它们。虽然Michaels解决方案在显式映射列时确实有效,但对于使用默认映射模式的任何列,它都会崩溃。此解决方案(在我有限的测试grails 1.3.6中)似乎适用于这两种情况。仅在此处测试-在没有自定义列映射时不起作用。在grails 2.5上验证。3getClassMetadata()已被弃用,有替代方案吗?