计算 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、标准和查询位置;例如如何使用投影和连接。请随时检查它们。
我在查询时遇到问题。我想要做的是通过来自 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、标准和查询位置;例如如何使用投影和连接。请随时检查它们。