Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.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
Grails 可以访问域类的groovy脚本_Grails - Fatal编程技术网

Grails 可以访问域类的groovy脚本

Grails 可以访问域类的groovy脚本,grails,Grails,我希望有一个groovy脚本,可以访问我的域类并从中提取所有属性 到目前为止,我还没有在Grails应用程序中编写任何groovy脚本 我该怎么做 我在想类似的事情 run-script <scriptname> 运行脚本 在脚本中,我想 For all Domain classes For all Fields println (<database-table-name>.<database-field-name>) 适用于所有域类 适

我希望有一个groovy脚本,可以访问我的域类并从中提取所有属性

到目前为止,我还没有在Grails应用程序中编写任何groovy脚本

我该怎么做

我在想类似的事情

run-script <scriptname>
运行脚本
在脚本中,我想

For all Domain classes
  For all Fields
      println (<database-table-name>.<database-field-name>)
适用于所有域类
适用于所有领域
println(.)

实现这一点最简单的方法是什么。

下面我提供了一个脚本代码,您可以使用它列出所有域类及其属性。此脚本生成一个映射,其中包含域及其属性的db映射。如果您有不同的需求,可以使用相同的方法来实现

import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
import org.codehaus.groovy.grails.commons.DomainClassArtefactHandler
import org.codehaus.groovy.grails.orm.hibernate.persister.entity.GroovyAwareSingleTableEntityPersister as GASTEP
import org.hibernate.SessionFactory

//Include script dependencies required for task dependencies
includeTargets << grailsScript("Bootstrap")

target(grailsDomianMappings: "List down  field details for all grails domain classes") {
    //Task dependencies required for initialization of app. eg: initialization of sessionFactory bean
    depends(compile, bootstrap)

    System.out.println("Running script...")

    //Fetch session factory from application context
    SessionFactory sessionFactory = appCtx.getBean("sessionFactory")
    //Fetch all domain classes
    def domains = grailsApp.getArtefacts(DomainClassArtefactHandler.TYPE)

    GASTEP persister
    List<String> propertyMappings = []
    Map<String, List<String>> mappings = [:]

    //Iterate over domain classes
    for (DefaultGrailsDomainClass domainClass in domains) {
        //Get class meta data
        persister = sessionFactory.getClassMetadata(domainClass.clazz) as GASTEP

        propertyMappings = []
        //fetch table name mapping
        String mappedTable = persister.tableName

        //fetch all properties for domain
        String[] propertyNames = persister.propertyNames
        propertyNames += persister.identifierPropertyName

        //fetch column name mappings for properties
        propertyNames.each {
            propertyMappings += persister.getPropertyColumnNames(it).first()
        }

        mappings.put(mappedTable, propertyMappings)
    }

    //Print data
    mappings.each { String table, List<String> properties ->
        properties.each { String property ->
            System.out.println("${table}.${property}")
        }
        System.out.println("++++++++++++++++++++++++++++++++++++++++++++++")
    }
}
setDefaultTarget(grailsDomianMappings)
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
导入org.codehaus.groovy.grails.commons.DomainClassArtefactHandler
将org.codehaus.groovy.grails.orm.hibernate.persister.entity.GroovyAwareSingleTableEntityPersister作为GASTEP导入
导入org.hibernate.SessionFactory
//包括任务依赖项所需的脚本依赖项
包括目标
properties.each{String属性->
System.out.println(“${table}.${property}”)
}
System.out.println(“++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++”
}
}
setDefaultTarget(grailsDomianMappings)

谢谢这看起来棒极了。我将尽快尝试。我已将上述SKcript放在scripts/domain.groovy下。我尝试使用run script——stacktrace scripts/domain.groovy运行它,但我遇到了以下错误:加载Grails 2.3.5|环境设置为开发错误加载插件管理器:TomcatGrailsPlugin(使用--stacktrace查看完整跟踪)。错误| org.codehaus.groovy.grails.cli.ScriptExitException错误|位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)我可以做些什么来解决?使用--stacktrace运行并尝试查找原因,或者使用更新的stacktrace添加新问题