如何在使用多态关联时通过ID获取父项

时间:2017-12-18 10:24:41

标签: activejdbc javalite

我有一个多对多关系表site_sections,其中包含以下列:

id
site_id
section_id

用于sectionssites表之间的连接表。因此,一个网站有许多部分,并且许多网站中都有一个部分。 Sites表包含以下列:

id
store_number

sites_sections表用于与parameters表的多态关联。

我想通过store_number找到特定网站网站部分对应的所有参数。是否可以使用IN子句将site_settings.id数组传递给SQL,如下所示:

Parameter.where("parent_id IN (" + [1, 2, 3, 4] + ") and parent_type ='com.models.SiteSection'");

其中[1, 2, 3, 4]应该是来自 sites_sections 表的ID数组,还是有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

您的解决方案是正确的:

Site aSite = Site.findFirst("store_number=?", STORE_NUMBER); 
List<SiteSection> siteSections= SiteSection.where("site_id=?", aSite.getId()).include(Parameter.class); 
for (SiteSection siteSection : siteSections) { 
  List<Parameter> siteParams = siteSection.getAll(Parameter.class);
  for (Parameter siteParam : siteParams) { ... }
}

此外,通过使用include(),您还可以避免出现N + 1问题:http://javalite.io/lazy_and_eager#improve-efficiency-with-eager-loading

然而,可能有一个问题。如果您有大量参数,那么您将使用大量内存,因为include()会立即将所有结果加载到堆中。如果结果集相对较小,则通过运行单个查询来节省资源。如果结果集很大,则会浪费堆空间。

请参阅文档:LazyList#include()

附注:使用aSite.getId()aSite.getLongId()代替aSite.get("id")