加入Grails Criteria

时间:2016-01-13 18:41:31

标签: grails gorm grails-domain-class

我试图在grails中为以下域编写条件查询:

class Data {
    Long createdById // this is user id
    // other fields
}
class User {
   Company company
   // other fields
}

现在数据,顾名思义存储一些数据。它与User没有直接关系,但有一个字段createdById,它是User的id。
(我不能直接引用User in Data,因为它们属于不同的项目,其中Data来自自定义的可重用插件。)

现在,我想在Data上编写标准,并列出给定公司用户创建的所有记录。那是data.id == User.id and user.company == givenCompany

2 个答案:

答案 0 :(得分:2)

为了使用任何GORM / Hibernate查询方法(条件,where或HQL),您需要在域类之间建立关联。由于您无法从DataUser建立关联,因此您无法使用GORM使用您的域类编写查询。换句话说,您需要使用SQL; HQL(DomainClass.executeQuery()将不起作用)。但...

使用HQL

如果您愿意修改User并维护一些冗余数据,则可以使用HQL。

class User {
   Company company
   // other fields

   /* Add uni-directional one-to-many */
   static hasMany = [data: Data]
}

def data = AnyDomainClass.executeQuery('SELECT d FROM User as u INNER JOIN u.data AS d WHERE u.company = :company', [company: givenCompany])

单向一对多关联创建了一个连接表,需要对其进行维护以反映Data.createdById。 HQL连接语法暗示了需要关联的事实。如果您必须使用条件查询...

使用条件查询

要使用条件查询,您需要修改User并添加其他域类。原因是条件查询不能项目像HQL那样的关联。例如,这将工作:

def data = User.withCriteria {
    eq('company', givenCompany)

    projections {
        property('data')
    }
}

由于无法修改Data,这个 - 这是最简单的解决方案 - 也工作:

def data = Data.withCriteria {
    user {
        eq('company', givenCompany)
    }
}

所以,你需要一个中间人才能投射Data个实例:

class User {
   Company company
   // other fields

   static hasMany = [userData: UserData]
}

class UserData {
    Data data

    static belongsTo = [user: User]
}

def data = User.withCriteria {
    eq('company', givenCompany)

    projections {
        userData {
            property('data')
        }
    }
}

您可以想象,此方法还需要一些数据维护。

使用SQL

最后,您可以选择使用SQL并使查询返回域类实例。归结为这样的事情:

AnyDomainClass.withNewSession { session ->
    def data = session.createSQLQuery('SQL GOES HERE').addEntity(Data).list()
}

更多信息

有关详细信息,请查看以下文章:

  1. Domain class associations and how they work on the DB level
  2. Joining domain classes with GORM queries
  3. Using SQL and returning domain class instances 1月22日上市。

答案 1 :(得分:1)

如果您能够为此创建sql查询而无法为此创建条件,那么您可以查找executeQuery

我希望它能够发挥作用

相关问题