如何建立条件查询以获取我的域的数据

时间:2016-02-03 15:30:40

标签: grails criteria hibernate-criteria

我知道必须非常轻松,但我是grails的新手,我找不到任何明确的答案。我想要做的是阅读并获得条件查询我在我的域中的数据搜索每个参数。

这是我的域名人员:

    String name
    String surname
    String address
    String village
    String country

这就是我要做的事情:

def getData = Person.createCriteria()

我可以在日志中看到我有一个对象(com.mypackagename.Person:1。),但不是我在数据库中拥有的数据。例子(myname,mysurname,myaddress,myvillage,mycountry)

我的数据库中只有一行数据,我想获取每列的数据并搜索每个参数

提前致谢。

2 个答案:

答案 0 :(得分:1)

让我先告诉你代码,然后我会解释一下:

class SomeController {

    def search() {
        def people = Person.withCriteria {
            params
                .findAll { name, value -> name in ['name', 'surname', 'address', 'village', 'country'] }
                .each { name, value -> eq(name, value) }
        }

        // Do as you please with 'people'; a list of Person instances.
    }
}

好的,我们假设你有一个控制器方法(例如search()),它接收来自用户的查询参数。参数将在params地图中。例如,如果用户搜索名称​​ John 且国家/地区 USA ,则params将如下所示:[name: 'John', country: 'USA']。即使有其他可用的搜索参数,我们也不会使用它们,因为用户没有指定它们。

在条件查询中,首先搜索您关心的param键/值对; Person的可搜索属性。然后,对于每个对,调用eq(String propertyName, Object value)来设置查询条件(WHERE子句)。

使用示例数据,Hibernate将生成如下所示的SQL:

SELECT name, surname, address, village, country 
FROM person 
WHERE name = 'john' AND country = 'USA'

就是这样!

注意:您将在日志中看到相同的输出(例如com.mypackagename.Person:1)。那是因为你正在记录personInstance.toString()。因此,如果您希望日志条目看起来不同,则需要覆盖Person.toString() 非常简单的方法来解决这个问题,即使用Groovy的@ToString AST。

有关创建条件查询的更多信息,请查看我的articles系列。我使用SQL术语覆盖标准查询。

答案 1 :(得分:0)

尝试使用:

def persons = Person.createCriteria().list{}

或者如果您只想要一个结果:

def persons = Person.createCriteria().list { 
    maxResults 1 
} 

此外,请阅读using CriteriaQuerying with GORM