计算 grails 中的一对一关系

Count one-to-one relationship in grails

我在查询时遇到问题。我想要做的是通过来自 MyDomainB 的查询访问 MyDomainA 中我的 "String code" 中的数据。表之间的关系是单向的一对一。

是否可以使用 gorm 方式来做到这一点??

域名A:

class LicenceType {

    String code
    String description
    Double price

    static constraints = {
    }

}

TABLE 域 A

code description
A    this is A
B    this is B
C    this is C

域B:(具有单向关系)

class VoiceUser {

LicenceType licenceType

String username
String email
String nameID

}

TABLE 域 B

User 
1    
2    
3    
4  

我想知道有多少用户有相同的code(code是DomainA的一列,两个表都是单向关系,如我之前所说)。

这是我正在尝试做的错误... 控制器:

        def resulta = VoiceUser.executeQuery('SELECT a.code, COUNT(b.nameID) FROM VoiceUser AS b INNER JOIN b.licenceType AS a GROUP BY a.code')

def resultCount = resulta[0]

这是我希望的一些示例结果...

Users with code A = 2
Users with code B = 2
Users with code C = o

诀窍是在 code 上执行 group by,在 user 上执行 count()。您可以使用 HQL 或条件查询来执行此操作。

HQL

这是一个 HQL 示例:

VoiceUser.executeQuery('SELECT licence.code, COUNT(user) FROM VoiceUser AS user INNER JOIN user.licenceType AS licence GROUP BY licence.code')

如果您熟悉 SQL,那么其中的大部分应该马上就明白了。一个重要的区别是加入域 类 的语法。 HQL 处理域 类,而不处理表。

条件查询

这是等效的条件查询。

VoiceUser.withCriteria {
    projections {        
        licenceType {
            groupProperty('code')
        }

        count('id')
    }
}

替代查询

上面显示的查询 return 一个 List<List> 像这样:

[
    ['A', 2], 
    ['B', 2], 
    ['C', 0]
]

如果您提供 LicenceType(或其代码)作为查询的输入,那么您可以获得 LicenceType 的计数。例如,这里是检索许可证代码 'A'.

的用户数的示例

HQL

def result = VoiceUser.executeQuery('SELECT COUNT(user) FROM VoiceUser AS user INNER JOIN user.licenceType AS licence WHERE licence.code = :code', [code: 'A'])[0]

条件查询

def result = VoiceUser.createCriteria().get {
    licenceType {
        eq('code', 'A')
    }

    projections {        
        count('id')
    }
}

其他资源

我有一个 series of articles 详细解释了 HQL、标准和查询位置;例如如何使用投影和连接。请随时检查它们。