简体   繁体   中英

Grails query on a domain with a property that is a set of strings

I am trying to query a domain that looks like this:

class MyDomain {
    String something  
    String somethingElse
    Set someStrings

    static hasMany = [someStrings: String]

    static mapping = {
       //... etc.
       someStrings: cascade: 'all'
       //... etc.
    }
}

The domain is in a dependency I didn't write and can't modify.

I would like to find all MyDomains where the Set someStrings contains, say, 'xyz'.

Please show me how, dynamically, with a criteria, or whatever you consider the best practice, I can do this in Grails. My project and the dependency are using Grails 2.44.

In my opinion, using a Collection as a property in a grails Domain is already an anti-pattern, so asking for a "best practice" on top of that is kind of ironic.

FWIW, here's my attempt.

Grails builds a table for your Set of strings, so you can use a classic SQL query, and bind the results to the domain class, like this:

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()
        }
    }
}

I could not test the code, so there may be typos. I believe that my table and column names match what grails would generate for your example. In any case the principle of binding a domain class to a resultset works in my code.

UPDATE: Not sure if it will work, but you could try this:

MyDomain.findAll {
    someStrings.contains "xyz"
}

It is theoretically possible within the DSL of where queries, but I haven't tried it. I'd be impressed if they thought about this.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM