Как запросить составной объект в JPA? - PullRequest
1 голос
/ 03 марта 2012

Я хочу сейчас, если JPQL может получить составной объект.ObjectA имеет ObjectB (Агрегация).Могу ли я запросить ObjectB, где нет связи с ObjectA.NAtive Query будет выглядеть так:

SELECT * FROM OBJECTB WHERE  ID_OBJECTA = NULL

Иногда JPA создает ассоциативную сущность, но я предположил, что здесь просто добавил ID_OBJECTA в качестве ссылки на его агрегатор.

Спасибо за вашу помощь.

Class ClassA{
public ClassB b;
}

ClassB{
public String data;

}

Я знаю, что могу сделать запрос следующим образом:

Select a from ClassA a join a.b bb//Given a retrieve b

Я хочу сделать это:

Select b from ClassB b join ...// ClassB doenst have an a Attribute

Как я могу сделать запросClassA от ClassB

Ответы [ 2 ]

0 голосов
/ 04 марта 2012

Ваш первый запрос, AFAIK, невозможно реализовать без связи от B до A. Тот факт, что у вас есть такой запрос, свидетельствует о том, что эта связь должна существовать.

Уродливый обходной путь заключается виспользуйте этот запрос:

select b from B b where b.id not in (select b.id from A a join a.b b)

Возможны и другие запросы, чем тот, который вам нужен:

select b from A a join a.b b where ...
0 голосов
/ 04 марта 2012

То, что вы хотите - это двунаправленная ассоциация один-к-одному.У вас есть два варианта в этом случае Lazily или Eagerly загружены.Ни один из них не требует явного соединения в вашем JQL, если вы не хотите переопределить отложенную загрузку и энергичную загрузку.Это, конечно, основано на том факте, что ваши аннотации / xml, определяющие отношения между этими объектами, настроены правильно.

Вам потребуется свойство в ClassB для типа ClassA, чтобы сохранить изменения в отношениях ClassB независимо от ClassA.Это свойство также позволит дочерним запросам в ClassB заполнять родительский член ClassA данными (с нетерпением) или с заглушками запросов (ленивыми)

public ClassA{
   ClassB Child;
}

public ClassB{
   ClassA parent;
   String data;
}

Проверьте эту запись в вики-книгах, в которой рассказывается, как ее настроить. One To One В нем описан очень похожий сценарий, когда мы имеем дело с Person с Address и рассказываем, как получить человека, запрашивая адрес.

Примечание: я только что прочиталчто вы пытаетесь сделать это без ассоциации.Как и другие авторы заметили, тривиально добавлять это отношение, если оно ленивое, оно почти не добавляет накладных расходов.Единственная причина, по которой я могу думать об этом, заключается в некоторой ошибочной попытке избежать загрязнения класса B ссылками на ClassA.Помните «Хуже лучше» Простота -> Правильность -> Согласованность -> Полнота.Сделайте это самым простым способом, который решит вашу проблему, и не проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...