Намерете всички обекти със стойност в списъка

Представям се в средата на Grails (страхотно е). Жънех предимствата на динамично генерирани методи като диапазона findAllBy*. Попаднах обаче на проблем и не съм сигурен как да продължа. Един час, прекаран в Google, също не ми донесе много.

Проблем

Имам клас като следния:

class Runner {

    static hasMany = [owners: Owner]
}

И в моя Owner контролер искам да намеря всички Runner обекти, които съдържат даден Owner. На практика се опитвам да премина от many към one.

Пример

Ако имам Owner обект, това изглежда нещо като

Owner[name="Dave"]

И аз имам Runner с нещо като:

Runner[owners[Owner[name="Dave"], Owner[name="James"]]]

Моята заявка трябва да върне този Runner обект, но не трябва да върне

Runner[owners[Owner[name="Bill"], Owner[name="James"]]]

Моите опити

Опитах се да използвам разширението inList, но след известно допълнително проучване разбрах, че е предназначено за обратното. Моят код в момента е следният:

def runners() {
    log.info("Runners")
    List<Runner> runners;
    Owner owner;

    if (params.id) {
        log.info("Id = " + params.id);
        owner = Owner.get(params.id);
        log.info("owner = " + owner.name);
        // Grab runners in list thing.
        log.info("Number of results = " + runners.size());
    }


    [results: results, jockeyInstance: jockey]
}

person christopher    schedule 25.02.2014    source източник
comment
възможен дубликат на Grails: Как мога да търся деца във връзка hasMany?   -  person tim_yates    schedule 25.02.2014
comment
какъв проблем имаш с inList? трябва да работи за този случай   -  person Igor Artamonov    schedule 25.02.2014
comment
inList, според документацията беше за обратното. Защото, когато предавам List и ако елементът в класа е вътре в това List, тогава го връщам.   -  person christopher    schedule 25.02.2014
comment
@christopher О, разбирам   -  person Igor Artamonov    schedule 25.02.2014


Отговори (3)


След известно проучване на HQL, намерих по-елегантно решение, което изобщо не изискваше от мен да променям класовете Domain. Заявката, която използвах, беше следната:

runners = Runner.executeQuery("FROM Runner as r WHERE :owner in elements(r.owners)", [owner : ownerInstance]);

Където ownerInstance е обектът Owner, използван за картографиране към Runner.

person christopher    schedule 25.02.2014
comment
Опитах го с кода от моя отговор и работи като рекламиран. това трябва да се счита за отговор. - person cfrick; 25.02.2014

може би не е отговорът на въпроса, но можете също така да уведомите собствениците за бегачите по този начин

    class Runner {
            String name
            static hasMany = [ owners: Owner ]
            static belongsTo = Owner
    }


    class Owner {
            String name
            static hasMany = [ runners: Runner ]
    }

    Owner o1 = new Owner(name: "O1").save()
    Owner o2 = new Owner(name: "O2").save()
    Owner o3 = new Owner(name: "O3").save()
    new Runner(name: "R1").with{
            addToOwners(o1)
            addToOwners(o2)
            save()
    }
    new Runner(name: "R2").with{
            addToOwners(o1)
            addToOwners(o3)
            save()
    }
    print o3.runners

води до [runnerowner.Runner : 2]

person cfrick    schedule 25.02.2014
comment
Това определено е една опция, така че +1. - person christopher; 25.02.2014

Това ли е нещо, което очаквате?

def results = Runner.withCriteria {
    owners {
        eq 'name', 'Dave'
        //idEq params.id //If id of owner is provided
    }
}

ако приемем, че имате

class Runner {
    static hasMany = [owners: Owner]
}

class Owner {
    String name
}

Ето пример, който можете да опитате.

person dmahapatro    schedule 25.02.2014