Grails对属性为一组字符串的域的查询

Grails对属性为一组字符串的域的查询,grails,gorm,Grails,Gorm,我正在尝试查询如下所示的域: class MyDomain { String something String somethingElse Set someStrings static hasMany = [someStrings: String] static mapping = { //... etc. someStrings: cascade: 'all' //... etc. } } im

我正在尝试查询如下所示的域:

class MyDomain {
    String something  
    String somethingElse
    Set someStrings

    static hasMany = [someStrings: String]

    static mapping = {
       //... etc.
       someStrings: cascade: 'all'
       //... etc.
    }
}
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()
        }
    }
}
域处于我未编写的依赖项中,无法修改

我想找到集合someStrings包含的所有MyDomains,比如“xyz”


请告诉我,如何动态地使用一个标准,或者不管你认为什么是最佳实践,我都可以在GRAILS中做到这一点。我的项目和依赖项使用Grails2.44

在我看来,在grails域中使用集合作为属性已经是一种反模式,因此要求在此基础上提供“最佳实践”有点讽刺意味

FWIW,这是我的尝试

Grails为您的字符串集构建一个表,因此您可以使用经典SQL查询,并将结果绑定到域类,如下所示:

class MyDomain {
    String something  
    String somethingElse
    Set someStrings

    static hasMany = [someStrings: String]

    static mapping = {
       //... etc.
       someStrings: cascade: 'all'
       //... etc.
    }
}
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()
        }
    }
}

理论上,在where查询的DSL中,这是可能的,但我还没有尝试过。如果他们考虑到这一点,我会留下深刻印象。

在我看来,在grails域中使用集合作为属性已经是一种反模式,因此要求在此基础上提供“最佳实践”有点讽刺意味

FWIW,这是我的尝试

Grails为您的字符串集构建一个表,因此您可以使用经典SQL查询,并将结果绑定到域类,如下所示:

class MyDomain {
    String something  
    String somethingElse
    Set someStrings

    static hasMany = [someStrings: String]

    static mapping = {
       //... etc.
       someStrings: cascade: 'all'
       //... etc.
    }
}
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()
        }
    }
}

理论上,在where查询的DSL中,这是可能的,但我还没有尝试过。如果他们想到这一点,我会印象深刻。

你能举例说明你到目前为止所做的尝试以及它们如何没有达到你的期望吗?我猜类似的事情是:
List domains=MyDomain.createCriteria().List{ilike(“someStrings”,“xyz%”)}
您能否添加一些示例,说明您迄今为止所做的尝试以及这些尝试如何没有达到您的期望?我猜类似于此:
列出域=MyDomain.createCriteria().List{ilike(“SomeString”,“xyz%”)}
同意您对最佳实践的评论。我正在处理的领域就是它。是的,像这样的办法行得通。我有点希望有一个漂亮的动态方式来做这件事,但我想不是。我知道你可以在列表中的属性上进行搜索,但不能反过来搜索。谢谢。也许有一种方法,我很想知道怎么做。我添加了一个建议,但我不知道它是否有效:-)同意回复:你对最佳实践的评论。我正在处理的领域就是它。是的,像这样的办法行得通。我有点希望有一个漂亮的动态方式来做这件事,但我想不是。我知道你可以在列表中的属性上进行搜索,但不能反过来搜索。谢谢。也许有一种方法,我很想知道怎么做。我添加了一个建议,但我不知道它是否有效:-)