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

Может ли кто-нибудь помочь мне со следующим вопросом? В приведенном ниже коде Госу, как я могу включить информацию о городе в таблицу адресов в результат запроса (без переворачивания таблиц - начиная с таблицы адресов)? Таблица адресов имеет внешний ключ, указывающий на пользовательскую таблицу, но не имеет внешнего ключа в обратном направлении. Может ли запрос строки сделать это? Большое спасибо

uses gw.api.database.Query

// -- query the User entity --
var queryUser = Query.make(User)

// -- select only User instances who last updated addresses in the city of Chicago --
var tableAddress = queryUser.join(Address, "UpdateUser")
tableAddress.compare("City", Equals, "Chicago") 

// -- fetch the User instances with a for loop and print them --
var result = queryUser.select()

for (user in result) {
    print (user.DisplayName)
}

person kev    schedule 09.02.2019    source источник


Ответы (1)


Поскольку Address имеет пользователя FK, почему бы не поменяться столами?

uses gw.api.database.Query

// -- query the Address entity --
var queryAddress = Query.make(Address)
queryAddress.compare("City", Equals, "Chicago") 

// -- select only User instances who last updated addresses in the city of Chicago --
var tableUser = queryAddress.join(Address#UpdateUser)

// -- fetch the Addresses instances with a for loop and print them --
var result = tableUser.select()

for (address in result) {
    print(address.City?.DisplayName)
    print(address.UpdateUser?.DisplayName)
}
person hakamairi    schedule 11.02.2019
comment
Спасибо hakamairi за ответ. Но что я действительно хотел бы знать, так это то, что: предоставляет ли gosu (Guidewire) способ доступа к свойствам вторичного объекта, когда внешний ключ доступен только с правой стороны. Я бы отредактировал исходные вопросы, чтобы сделать их более понятными. - person kev; 13.02.2019
comment
@kev, я не думаю, что это хорошо соотносится с объектами. Поскольку вы, пользователь, ничего не знаете об UpdateUser по адресу, у вас нет доступа к ним. Также обратное соединение используется, когда у вас есть массив другого типа, поэтому он будет доступен, если вы добавите массив адресов для пользователя. Другой способ - просто использовать JDBC Resultset напрямую, там вы можете получить все необходимые столбцы. - person hakamairi; 13.02.2019
comment
Спасибо @hakamairi, основываясь на утверждениях в документации, цитируемых в комментарии ниже, похоже, что Row Queries — это то, что нужно, но я просто не могу понять, как это сделать. Может быть, сама документация не так точна. Кстати, не могли бы вы дать мне образец в Gosu, чтобы использовать JDBC Resultset напрямую, чтобы получить все столбцы, как вы предложили? Спасибо - person kev; 14.02.2019
comment
Здесь @hakamairi - это утверждения из документации в отношении примера кода в исходном вопросе: в предыдущем примере запроса Gosu вы не можете определить, какие адреса конкретных пользователей в последнем обновленном результате. В некоторых случаях это не проблема. Часто вы используете результаты внутренних запросов с внешними ключами справа для дальнейшей обработки, не обращаясь к какой-либо информации из связанных экземпляров, которые привели к результату. Если вы хотите получить доступ к информации, например, для отображения на экране или в отчете, см. «Работа с запросами строк». - person kev; 14.02.2019
comment
Поскольку select({QuerySelectColumns..} действительно начинается с вашей базовой сущности, это невозможно сделать, если вы начинаете с User. - person hakamairi; 14.02.2019