Groovy动态列表交互

时间:2011-07-07 22:30:23

标签: grails dynamic groovy gorm

我使用的是旧版本的grails(1.1.1),我正在为政府客户开发遗留应用程序。

这是我的问题(以伪版形式):

我有一个域名是Book。它有一个与之关联的类型的子域(1:很多关系)。 Author域有firstName和lastName字段。

def c = Book.createCriteria()
      def booklist = c.listDistinct {
          author {
              order('lastName', 'asc')
              order('firstName', 'asc')
          }
}

假设我有一个我希望稍后用于excel导出的字段列表。此列表包含作者域调用和我要使用的列的标题。

Map fields = ['author.lastName' : 'Last Name', 'author.firstName', 'First Name']

如何动态调用以下代码 -

booklist.eachWithIndex(){
  key, value ->
  println key.fields
}

目的是我可以创建我的Map字段并使用循环快速显示所有数据,而无需手动输入所有字段。

注意 - 尝试输出密钥'author.lastName'时,字符串['author.lastName']中的句点会引发错误。

1 个答案:

答案 0 :(得分:1)

我不记得Grails 1.1附带的Groovy版本,但是有很多语言结构可以做这样的事情。如果是旧版本,可能无法使用某些内容 - 因此您的里程可能会有所不同。

可以使用引号字符串引用映射键,例如

def map = [:]
map."person.name" = "Bob"

以上将在地图中有一个person.name键。

地图可以包含任何内容,包括Groovy中的混合类型 - 因此,如果您使用更复杂的密钥,那么您真的需要解决字符串转义或其他特殊情况。

你也可以在上面的

中使用GString
def map = [:]
def prop = "person.name"
map."${prop}" = "Bob"

您还可以通过其上的属性字段动态地获取类的属性/值的映射。 E.g:

class Person { String name;String location; }
def bob = new Person(name:'Bob', location:'The City')
def properties = bob.properties
properties.each { println it }