JPA和谷歌应用引擎中的多对多关系

我有实体A和B,A可以有B的集合.B的相同实例可以属于几个A.所以这里有经典的多对多关系。

在GAE中,没有多对多关系的直接支持,相反,它们提供了使用密钥集来进行相关关系的能力。 所以在AI中将维护B中的记录键集。

现在的问题是 – 如何查询属于类型A的给定对象并匹配某些条件的B类对象? 在纯SQL中,我会这样做:

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

但因为我不能做JOIN然后我需要做类似的事情

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

因此,由于ID的数量,查询本身可能会很长。

有没有更好的方法?

如果您重构关系映射,则可以获得更好的查询。 不是在A中存储一组键,而是在B中存储一组键。然后您可以查询

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

这样可以避免in运算符创建的多个查询。

另外,请注意: in仅适用于30个元素或更少元素的列表。