Как настроить запрос поиска JPA на основе метода with() RequestFactorys

В моем приложении GWT 2.4.0 я использую RequestFactory и Hibernate/JPA. У меня есть объект Agent, который имеет много отношений Administrators через @OneToMany. Эта ассоциация LAZY загружена. Таким образом, когда вызывается служба поиска, администраторы агента не загружаются, что в большинстве случаев является желаемым поведением.

Однако я хочу иметь возможность указать, что я хочу, чтобы администраторы агента вернулись при запуске запроса requestFactory в коде на стороне клиента с помощью метода with. Итак, мой клиентский код будет выглядеть примерно так:

RequestContext.findAgent(agentId).with("administrstors").fire()

и моя служба на стороне сервера выглядит примерно так:

public Agent findAgent(Long id) {
    return getEntityManager().createQuery("SELECT a" +
            " FROM Agent" +
            " WHERE a.id=:id", Agent.class)
            .setParameter("id", id)
            .getSingleResult();
}

Я хочу выяснить, использовался ли метод with для отправки запроса. Мне нужно настроить запрос JPA, чтобы также загружать администраторов агента в случае, если он использовался на стороне клиента. Есть ли способ получить доступ к деталям запроса, сделанного через RequestFactory на стороне сервера?

Если я знаю, что клиентскому коду нужны администраторы агента, мой запрос JPA будет выглядеть так:

public Agent findAgent(Long id) {
    return getEntityManager().createQuery("SELECT a" +
            " FROM Agent a LEFT JOIN a.administrators admin" +
            " WHERE a.id=:id", Agent.class)
            .setParameter("id", id)
            .getSingleResult();
}

Любое понимание будет оценено. Заранее спасибо.


person mkhezr    schedule 25.07.2012    source источник
comment
Не знаю о части GWT, но запрос JPA неверен. Следует выбрать отличный от агента левого соединения fetch a.administrators admin, где ...   -  person JB Nizet    schedule 25.07.2012
comment
@JBNizet: Правильно, ключевое слово DISTINCT должно быть включено. Однако вы можете отказаться от выборки.   -  person mkhezr    schedule 26.07.2012
comment
Нет, ты не можешь. Без выборки администраторы не будут загружены. Если бы они были, fetch не имел бы никакой полезности.   -  person JB Nizet    schedule 26.07.2012
comment
Я использую LEFT JOIN без ключевого слова FETCH в нескольких местах своего кода и возвращаю коллекцию в свой набор результатов. Я искал в документации Hibernate, чтобы найти объяснение. Также просмотрел документы JPA здесь: : важным вариантом использования LEFT JOIN является включение предварительной выборки связанных элементов данных в качестве побочного эффекта запроса. Это достигается указанием LEFT JOIN как FETCH JOIN.   -  person mkhezr    schedule 28.07.2012


Ответы (1)


К сожалению, это невозможно; вам придется передать информацию в качестве дополнительных аргументов метода в дополнение к with().

К вашему сведению, это обсуждалось 2 года назад в Google Wave (у меня есть локальная резервная копия, но в остальном ее нигде нельзя найти в Интернете) с несколькими предложениями (необязательный Set<String> передается в качестве последнего аргумента методам службы — ваш findAgent method–, или локальный список свойств потока).
Ничего подобного не было реализовано, и, оглядываясь назад, я не уверен, что так и должно быть: передача информации явно в качестве аргументов вашему методу является более явной / имеет в нем меньше магии.

person Thomas Broyer    schedule 25.07.2012