我正在尝试查询看起来像这样的域:
class MyDomain {
String something
String somethingElse
Set someStrings
static hasMany = [someStrings: String]
static mapping = {
//... etc.
someStrings: cascade: 'all'
//... etc.
}
}
域名处于依赖状态,我没有写入且无法修改。
我想找到Set someStrings包含的所有MyDomains,比如说,' xyz'。
请告诉我如何动态地,使用标准,或者您认为最佳做法,我可以在Grails中执行此操作。我的项目和依赖项使用的是Grails 2.44。
答案 0 :(得分:2)
在我看来,使用Collection作为grails域中的属性已经是一种反模式,因此在此基础上寻求“最佳实践”具有讽刺意味。
FWIW,这是我的尝试。
Grails为您的字符串集构建一个表,因此您可以使用经典的SQL查询,并将结果绑定到域类,如下所示:
import myapp.MyDomain
class MyDomainService {
List<MyDomain> findByKeyword(String keyword) {
MyDomain.withSession {session ->
def query = session.createSQLQuery("select distinct main.* from MY_DOMAIN as main inner join MY_DOMAIN_SOME_STRINGS as detail on main.id=detail.MY_DOMAIN_ID where detail.SOME_STRINGS_STRING = :keyword")
query.addEntity(MyDomain.class)
query.setString("keyword", keyword)
query.list()
}
}
}
我无法测试代码,因此可能存在拼写错误。我相信我的表名和列名与您的示例所生成的grails相匹配。在任何情况下,将域类绑定到结果集的原则都适用于我的代码。
<强>更新强> 不确定它是否有效,但你可以试试这个:
MyDomain.findAll {
someStrings.contains "xyz"
}
理论上可以在DSL内部查询,但我还没有尝试过。如果他们想到这一点,我会留下深刻的印象。