我有一个多对多关系表site_sections
,其中包含以下列:
id
site_id
section_id
用于sections
和sites
表之间的连接表。因此,一个网站有许多部分,并且许多网站中都有一个部分。
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数组,还是有更好的解决方案?
答案 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")