如何在测试环境中为 GORM 中的多对多关联执行 HQL 连接?
How do I do HQL join for many-to-many associations in GORM in test environment?
我有以下具有多对多关系的域 类(Product
和 Tag
):
class Product {
static belongsTo = Tag
static hasMany = [tags: Tag]
String name
Set tags
}
和
class Tag {
static hasMany = [products: Product]
String tag
Set products
}
每次我运行下面的HQL,我什么都得不到:
select p from Product p join p.tags t where t.tag like '%'
我确定数据存储中有数据,因为如果我更改结构以使关联为一对多(p.tag
而不是 p.tags
),我的测试就会通过。
试试看:
Product.findAll 'from Product where tags.tag like ?', [ '%something' ]
所以问题不在于查询无效; HQL 查询按预期工作。然而,问题是我用来检查查询的代码在 Grails 的测试环境下是 运行。默认情况下,该环境中使用的 GORM 未正确配置为支持 HQL 和其他字符串类型查询。必须设置测试代码,以便 Grails 在 运行 连接它时使用正确的 GORM。
总而言之,这是我为解决问题所做的事情(我在 Grails 2 中运行宁此。5.x):
- 用
@Domain([Product, Tag])
注释了测试 class
- 用
@TestMixin(HibernateTestMixin)
注释了测试 class
有关详细信息,请查看 the official Grails documentation。
我有以下具有多对多关系的域 类(Product
和 Tag
):
class Product {
static belongsTo = Tag
static hasMany = [tags: Tag]
String name
Set tags
}
和
class Tag {
static hasMany = [products: Product]
String tag
Set products
}
每次我运行下面的HQL,我什么都得不到:
select p from Product p join p.tags t where t.tag like '%'
我确定数据存储中有数据,因为如果我更改结构以使关联为一对多(p.tag
而不是 p.tags
),我的测试就会通过。
试试看:
Product.findAll 'from Product where tags.tag like ?', [ '%something' ]
所以问题不在于查询无效; HQL 查询按预期工作。然而,问题是我用来检查查询的代码在 Grails 的测试环境下是 运行。默认情况下,该环境中使用的 GORM 未正确配置为支持 HQL 和其他字符串类型查询。必须设置测试代码,以便 Grails 在 运行 连接它时使用正确的 GORM。
总而言之,这是我为解决问题所做的事情(我在 Grails 2 中运行宁此。5.x):
- 用
@Domain([Product, Tag])
注释了测试 class
- 用
@TestMixin(HibernateTestMixin)
注释了测试 class
有关详细信息,请查看 the official Grails documentation。