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

How to bulid a criteria query to get the data of my domain

我知道这一定很简单,但我是 grails 的新手,我找不到任何明确的答案。我想要做的是阅读并通过条件查询获取我在我的域中拥有的数据来搜索每个参数。

这是我的域名人:

    String name
    String surname
    String address
    String village
    String country

这是我想要做的:

def getData = Person.createCriteria()

我可以在日志中看到我有一个对象 (com.mypackagename.Person: 1.),但没有我在数据库中的数据。示例(我的名字、我的姓氏、我的地址、我的村庄、我的国家)

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

提前致谢。

尝试使用:

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

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

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

另外请阅读using Criteria and Querying with GORM

让我先给你看代码,然后我会解释它:

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 和国家 USAparams 将如下所示:[name: 'John', country: 'USA'].即使有其他可用的搜索参数,我们也不会使用它们,因为用户没有指定它们。

在条件查询中,首先搜索您关心的param key/value对; 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 术语涵盖条件查询。