1

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

id
site_id
section_id

它用于和表之间的连接sectionssites。因此,一个站点有许多部分,而一个部分在许多站点中可用。 Sites表具有以下列:

id
store_number

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

我想通过. _ _ 是否可以使用该子句将 site_settings.id 数组传递给 SQL ,如下所示:store_numberIN

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

sites_sections[1, 2, 3, 4]表中的 ID 数组应该在哪里,或者有更好的解决方案?

4

1 回答 1

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()oraSite.getLongId()代替aSite.get("id")

于 2017-12-18T14:21:35.710 回答