【发布时间】:2015-08-10 03:28:45
【问题描述】:
我们现在有一个基本表T_RESOURCE,其中包含基本资源信息,以及一些与T_RESOURCE有关系的其他表,例如T_RESOURCE_TAGS,它包含T_RESOURCE中资源的标签,一个资源可以有多个标签,这是这种表的一种;还有一种这种关系,连接一个中间类,比如T_FILES和T_RESOURCE用T_RESOURCE_FILES连接,确实T_RESOURCE_TAGS也是一个中间表,但是没有T_TAGS和T_FILES一样的表。我们与这两种格式(或形式)总共有 11 种关系。 我们有一个 T_RESOURCE 的实体类,其中所有相关的表都通过如下方式连接:
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
@IndexedEmbedded(indexNullAs = Field.DEFAULT_NULL_TOKEN)
@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany
@JoinTable(name="T_RESOURCE_FILES",joinColumns={ @JoinColumn(name="RESOURCE_ID", referencedColumnName="ID") },inverseJoinColumns={ @JoinColumn(name="FILE_ID", referencedColumnName="ID", unique=true) })
private List<TFILE> files;
@IndexedEmbedded(indexNullAs = Field.DEFAULT_NULL_TOKEN)
@LazyCollection(LazyCollectionOption.FALSE)
@ElementCollection
@CollectionTable(name = "T_RESOURCE_TAG", joinColumns = @JoinColumn(name = "RESOURCE_ID"))
@Column(name = "tag")
private List<String> tags;
我们将在 T_RESOURCE 中获取所有资源信息,其中包含适合用户搜索条件的所有资源 ID(RESOURCE_ID)。我们使用原生查询得到了结果:
em.createNativeQuery(sql.toString(),TRESOUCE.class).setFirstResult(firstResult).setMaxResults(pageSize).getResultList();
sql类似于
"select * from T_RESOURCE where id in ('1','2','3','4') order by ..."
它以这种方式工作,但是从 T_RESOURCE_TAGS、T_RESOURCE_FILES、其他 9 个关系中获取标签需要花费很多时间,它的工作方式是:
select * from T_RESOURCE_TAGS where asset_id = '1';
select * from T_RESOURCE_TAGS where asset_id = '2';
select * from T_RESOURCE_TAGS where asset_id = '3';
select * from T_RESOURCE_TAGS where asset_id = '4';
这样,如果更多的资源符合搜索条件,我们会发现更多的时间成本。
我也尝试过 join fetch,但似乎 join fetch 数量有限制,不起作用。 我也想将这些关系从 TRESOURCE 类中分离出来,并尝试像获取 TRESOURCE 基本信息一样获取它们。供参考,对于中间表,每条记录没有唯一的id,只有resouce_id和相关的id/或直接为文件、标签等命名。
能否请您给出您的想法,非常感谢。
【问题讨论】: