2010-09-16 3 views
4

Допустим, у меня есть два класса домена:Запрос класса домена Grails - как я могу найти по полям, которые ссылаются на другой класс домена?

class User { 
    String name 
    Role role 
} 

class Role { 
    String name 
    static belongsTo = [user: User] 
} 

и создать несколько записей:

def r1 = new Role(name: "role1").save() 
def r2 = new Role(name: "role2").save() 
new User(name: "user1", role: r1).save() 
new User(name: "user2", role: r2).save() 
new User(name: "user3", role: r1).save() 

Как я могу теперь выбрать моих пользователей по ролям? Я бы ожидать, чтобы быть в состоянии выполнить одно из следующих действий:

def role = Role.findByName("role1"); //returns a Role with [ id:1 name:"role1" ] 
User.findAllByRole(role) //returns null 
User.findAllByRole(new Role(name: "role1")) //returns null 
User.findAllByRole(role.id) //returns null 
User.findAllByRole(id: role.id) //returns null 

Возможно ли класс домена, чтобы найти другие связанные классы домена с помощью динамических методов находки *? Я могу сделать это с помощью namedQueries, но идентификатор, а не потому, что я не хочу, чтобы написать их для все отношения у меня есть между доменными классами

+1

На самом деле я кажусь идиотом. User.findAllByRole (роль) сейчас работает –

+0

Что не работает? Если бы это было не так просто, вы могли бы написать ответ на свой вопрос и принять его, чтобы ему помогли люди, имеющие такую ​​же проблему в будущем. –

ответ

3

Оказывается, что findBy * и findAllBy * методы работают, если вы извлеките объект, который вам нужно найти заранее. Похоже, что это должна быть точная (нестатическая?) Ссылка на объект в базе данных, поэтому вы не можете создать новый объект, который «выглядит» как объект, который вы хотите найти, он фактически должен быть, что объект.

Итак, для того, чтобы найти все пользователи с ролью «Role1»:

def role = Role.findByName("role1") 
def users = User.findAllByRole(role) 
for (def user in users) { 
println("User ${user.name} matched the query, with role: ${user.role.name}") 
} 
//prints: 
//User user1 matched the query, with role role1 
//User user3 matched the query, with role role1 
+0

FYI: Код в вашем вопросе * был * получение роли с помощью find. Это было не просто создание одного с теми же данными. –

+0

Я не думаю, что def в (пользовательский пользователь в пользователях) не требуется. для (пользователь в пользователях) {} должен работать нормально. – Vinny

+0

Я думаю, что ваш ответ противоречит вашему вопросу. В вашем вопросе у вас есть это: def role = Role.findByName ("role1"); // возвращает роль с [id: 1 name: "role1"] User.findAllByRole (role) // возвращает null. Почему это возвращает null? Здесь вы не создаете новый объект. Это то, что @JavidJamae говорит, я думаю. – dsharew

0

User.findAllByRole(role) не работает на модульных тестов. Полагаю, это вас смущает, Эрин.

Кажется, что запросы на запросы не возможны при модульных тестах. Я пробовал это так: User.findAllByRole(role.id), и он работает, хотя и не вне модульных тестов.

+0

Хаха 5 лет спустя ... Я давно отказался от Grails. В то время он был раздутым, невероятно медленным и кошмаром для развития. Теперь может быть лучше, я не знаю. Недавно я склонялся к чистой весне после пребывания в .NET. –

+0

Мне жаль беспокоить вас. У меня была такая же проблема, и эта тема была моим лучшим хитом при поиске в Google, поэтому я почувствовал, что должен что-то добавить к ней. Мне очень нравится Grails (из Java + Spring + Hibernate). –

+0

О, у меня нет проблем с вашим ответом, это способствует пулу знаний, который является удивительным. Спасибо, что нашли время, чтобы опубликовать его! –

Смежные вопросы