题
背景
我有一个表列 id,打算,propertyId.
可能有许多相关的图像与一个单一的财产和可能有许多相关联的属性与一个单一的形象。
imageId - many-to-many - propertyId
我有一个名单的propertyIds我想要找出所有相关的图像所有的propertyIds 使用休眠.
问题。
只是现在我选一个酒店的时间并使用标准API找到所有的imageIds与此相关的propertyId,我获得一个名单的imageIds.我使用这个名单的imageIds在下一个查询和说
select imageIds where imageId in (imageIds obtained in previous step) where propertyId = x
所以有效,查询的数量打击该数据库将同等数量的propertyIds.我不认为这是一个很好的解决方案,其具有击中的数据库n次,我试图使用分离的查询,但没有成功。是有一个更好的解决办法?
此外,当我最后得到的名单imageIds,这是一个很好的想法(让我们不要考虑的结果数量)存在的用户会议和分或者是一个很好的想法重复的整个过程,或者我应该考虑将其储存在数据库的所有用的目的页码?
解决方案
这里有一个问题,数据库架构:
你想要补习的3个独立协会联合会(图像收集、图片财产,收集财产)成一个单一的 ImageCollection 表。这不是一件好事。而你能得到与此使用普通SQL(花费大量的行空中的列表的),则不能适当地图这在休眠状态。顺便说一句,这个表格不需要一个代理主的关键。
你需要做的是分割成3个单独的表格和地图你的模范作为适当的许多对多在冬眠。例如:
@Entity
public class Image {
@ManyToMany
@JoinTable(
name="IMAGE_PROPERTIES",
joinColumns=@JoinColumn(name="IMAGE_ID"),
inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
)
private Collection<Property> properties;
...
}
IMAGE_PROPERTIES
表,只会有 IMAGE_ID
和 PROPERTY_ID
列;你将拥有 COLLECTION_IMAGES
和 COLLECTION_PROPERTIES
表只是喜欢它。
然后,你将能够查询图像酒店的名字,如:
from Image img
left join img.properties as prop
with prop.name in ('Tag1', 'Tag2', 'Tag3')
如果你的属性是真的很喜欢标签,一起来看看 这篇文章 为和/或/联合查询的例子。
如果你是真正的性质(即,他们有生命周期的所有人实体并不能属于多个实体在一次),考虑将它们拆分成两个表(一个用于图像和一个用于收集),并采用一个对许多协会。这样,你不需要 IMAGE_PROPERTIES
和 COLLECTION_PROPERTIES
表从上面。
其他提示
所以你必须一级这样(注:我没有写这一ide,这样的代码,可能不是语法上正确的):
public class Property {
@ManyToMany
private List<Image> images;
}
public class Image {
@ManyToMany
private List<Property> properties;
}
这样的查询喜欢 select property from Property property
应该得到你的名单的属性,它可以得到通过正常的Java性质。
是,你在寻找什么,或者我有没有误解的问题吗?