Grails:按属性查找域类

Grails:按属性查找域类,grails,groovy,Grails,Groovy,我是Grails/groovy的新手,正在寻找一种编写代码的优化方法 域类: class Visitors { int ID; String destination; String status; // Status can be OK, FAIL, DONE, REDO, NEW, LAST, FIRST ......... .......... } 现在在控制器中: class VisitorsController { def getVis

我是Grails/groovy的新手,正在寻找一种编写代码的优化方法

域类:

class Visitors {
    int ID;
    String destination;
    String status; // Status can be OK, FAIL, DONE, REDO, NEW, LAST, FIRST
    .........
    ..........
}
现在在控制器中:

class VisitorsController {

    def getVisitors() {
        Visitors.findAllByStatus().each { } // This is where i have confusion
  }
}
在上面的注释行中,我想获取没有状态=OK的所有访问者对象,然后进行循环并在那里更新状态=重做

状态在另一个类中定义:

public enum VisitorsStatusEnum { NEW, OK, FAIL, DONE, REDO, LAST, FIRST }

有什么建议吗?

对enum做一些小的修改,并使用query而不是
findAllBy
将产生预期的结果

//src/groovy
enum VisitorsStatusEnum { 
    NEW('NEW'), OK('OK'), FAIL('FAIL'), 
    DONE('DONE'), REDO('REDO'), LAST('LAST'), FIRST('FIRST')

    private final String id

    private VisitorsStatusEnum(String _value) { 
        id = _value 
    }

    String getId() { id }
}

// Domain class
class Visitors {
    Integer ID
    String destination
    VisitorsStatusEnum status
}

//Controller
class VisitorsController {
    def getVisitors() {
        def query = Visitors.where { 
            status != VisitorsStatusEnum.OK 
        }

        // Prefer batch update instead
        query.updateAll( status: VisitorsStatusEnum.REDO )

        render 'Updated'
    }
}

只需对enum进行少量修改,并使用query而不是
findAllBy
即可产生预期的结果

//src/groovy
enum VisitorsStatusEnum { 
    NEW('NEW'), OK('OK'), FAIL('FAIL'), 
    DONE('DONE'), REDO('REDO'), LAST('LAST'), FIRST('FIRST')

    private final String id

    private VisitorsStatusEnum(String _value) { 
        id = _value 
    }

    String getId() { id }
}

// Domain class
class Visitors {
    Integer ID
    String destination
    VisitorsStatusEnum status
}

//Controller
class VisitorsController {
    def getVisitors() {
        def query = Visitors.where { 
            status != VisitorsStatusEnum.OK 
        }

        // Prefer batch update instead
        query.updateAll( status: VisitorsStatusEnum.REDO )

        render 'Updated'
    }
}

只需对enum进行少量修改,并使用query而不是
findAllBy
即可产生预期的结果

//src/groovy
enum VisitorsStatusEnum { 
    NEW('NEW'), OK('OK'), FAIL('FAIL'), 
    DONE('DONE'), REDO('REDO'), LAST('LAST'), FIRST('FIRST')

    private final String id

    private VisitorsStatusEnum(String _value) { 
        id = _value 
    }

    String getId() { id }
}

// Domain class
class Visitors {
    Integer ID
    String destination
    VisitorsStatusEnum status
}

//Controller
class VisitorsController {
    def getVisitors() {
        def query = Visitors.where { 
            status != VisitorsStatusEnum.OK 
        }

        // Prefer batch update instead
        query.updateAll( status: VisitorsStatusEnum.REDO )

        render 'Updated'
    }
}

只需对enum进行少量修改,并使用query而不是
findAllBy
即可产生预期的结果

//src/groovy
enum VisitorsStatusEnum { 
    NEW('NEW'), OK('OK'), FAIL('FAIL'), 
    DONE('DONE'), REDO('REDO'), LAST('LAST'), FIRST('FIRST')

    private final String id

    private VisitorsStatusEnum(String _value) { 
        id = _value 
    }

    String getId() { id }
}

// Domain class
class Visitors {
    Integer ID
    String destination
    VisitorsStatusEnum status
}

//Controller
class VisitorsController {
    def getVisitors() {
        def query = Visitors.where { 
            status != VisitorsStatusEnum.OK 
        }

        // Prefer batch update instead
        query.updateAll( status: VisitorsStatusEnum.REDO )

        render 'Updated'
    }
}

我得到一个错误:无法查询属性“it”-在类更新的答案上没有这样的属性。应该是
状态!=VisitorsStatusEnum.OK
而不是
it.status!=VisitorsStatusEnum.OK
在where查询中。另请注意,上面在action方法中的实现就是一个例子。根据您的需要(例如,渲染/重定向等),实现可能会有所不同。有关更多详细信息,请参阅文档。我已接受您的回答。有没有一种方法可以像我在最初的问题中提到的那样使用每一种方法?因为出于我的目的,我需要一个访客类的对象,它会循环通过。是的,你可以
query.list()
将给出一个可访问的访问者列表。您可以使用动态查找器作为
Visitor.findAllByStatusNotEqual(VisitorsStatusEnum.OK)
,而不是使用where查询。但其中的查询是一个
DetachedCriteria
,并且在操作中是惰性的。我得到一个错误:无法查询属性“it”-classUpdated answer上没有这样的属性。应该是
状态!=VisitorsStatusEnum.OK
而不是
it.status!=VisitorsStatusEnum.OK
在where查询中。另请注意,上面在action方法中的实现就是一个例子。根据您的需要(例如,渲染/重定向等),实现可能会有所不同。有关更多详细信息,请参阅文档。我已接受您的回答。有没有一种方法可以像我在最初的问题中提到的那样使用每一种方法?因为出于我的目的,我需要一个访客类的对象,它会循环通过。是的,你可以
query.list()
将给出一个可访问的访问者列表。您可以使用动态查找器作为
Visitor.findAllByStatusNotEqual(VisitorsStatusEnum.OK)
,而不是使用where查询。但其中的查询是一个
DetachedCriteria
,并且在操作中是惰性的。我得到一个错误:无法查询属性“it”-classUpdated answer上没有这样的属性。应该是
状态!=VisitorsStatusEnum.OK
而不是
it.status!=VisitorsStatusEnum.OK
在where查询中。另请注意,上面在action方法中的实现就是一个例子。根据您的需要(例如,渲染/重定向等),实现可能会有所不同。有关更多详细信息,请参阅文档。我已接受您的回答。有没有一种方法可以像我在最初的问题中提到的那样使用每一种方法?因为出于我的目的,我需要一个访客类的对象,它会循环通过。是的,你可以
query.list()
将给出一个可访问的访问者列表。您可以使用动态查找器作为
Visitor.findAllByStatusNotEqual(VisitorsStatusEnum.OK)
,而不是使用where查询。但其中的查询是一个
DetachedCriteria
,并且在操作中是惰性的。我得到一个错误:无法查询属性“it”-classUpdated answer上没有这样的属性。应该是
状态!=VisitorsStatusEnum.OK
而不是
it.status!=VisitorsStatusEnum.OK
在where查询中。另请注意,上面在action方法中的实现就是一个例子。根据您的需要(例如,渲染/重定向等),实现可能会有所不同。有关更多详细信息,请参阅文档。我已接受您的回答。有没有一种方法可以像我在最初的问题中提到的那样使用每一种方法?因为出于我的目的,我需要一个访客类的对象,它会循环通过。是的,你可以
query.list()
将给出一个可访问的访问者列表。您可以使用动态查找器作为
Visitor.findAllByStatusNotEqual(VisitorsStatusEnum.OK)
,而不是使用where查询。但其中的查询是一个
分离的条件
,并且在操作中是惰性的。