JPA и отношения «многие ко многим» в Google App Engine - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть сущности A и B, и у A может быть множество B. Один и тот же экземпляр B может принадлежать нескольким A. Так что здесь есть классическое отношение «многие ко многим».

В GAE нет прямой поддержки отношений «многие ко многим», вместо этого они предлагают возможность использовать наборы ключей для связанных отношений. Так что в A я буду поддерживать множество ключей записей в B.

Теперь проблема в том, как я могу запросить объекты типа B, принадлежащие данному объекту типа A и соответствующие определенным критериям? В простом SQL я бы сделал это так:

select B.* 
from 
    B inner join A 
        on B.A_ID=A.ID 
where B.property0=criteria1 
      and B.property1=criteria2 ...
      and ...

но поскольку я не могу присоединиться, мне нужно сделать что-то вроде

select B.* 
from B 
where B.A_ID in ( ... ) 
      and B.property0=criteria1 
      and B.property1=criteria2 ...
      and ...

поэтому сам запрос может быть очень длинным из-за количества идентификаторов.

Есть ли лучший способ?

1 Ответ

1 голос
/ 08 ноября 2011

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

select * from B where a_id = {idOfRelevantA} and property0 = {criterion0} and property1 = {criterion1}...

Таким образом, вы избегаете множественных запросов, которые создает оператор in.

Кроме того, будьте осторожны: in будет работать только для списка из 30 элементов или менее.

...