Grails在域上查询,其属性是一组字符串

时间:2018-02-22 02:21:35

标签: grails gorm

我正在尝试查询看起来像这样的域:

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。

1 个答案:

答案 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内部查询,但我还没有尝试过。如果他们想到这一点,我会留下深刻的印象。