计算grails中的一对一关系

时间:2015-12-02 12:47:37

标签: sql grails gorm

我在查询时遇到问题。我想要做的是通过MyDomainB中的查询访问MyDomainA中我的“字符串代码”中的数据。表之间的关系是一对一的单向。

可以使用gorm方法来做到这一点吗?

域名A:

class LicenceType {

    String code
    String description
    Double price

    static constraints = {
    }

}

TABLE DOMAIN 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 DOMAIN B

User 
1    
2    
3    
4  

我想要做的是知道有多少用户拥有相同的代码(代码是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

1 个答案:

答案 0 :(得分:2)

诀窍是group by上的codecount()上的user。您可以使用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')
    }
}

替代查询

上面显示的查询会返回List<List>,如下所示:

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

如果您提供LicenceType(或其代码)作为查询的输入,那么您可以获得LicenceType的计数。例如,以下是检索许可证代码的用户数的示例&#39; A&#39;。

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,标准以及详细查询的位置;比如如何使用投影和连接。随意检查出来。