Hibernate 休眠自连接

Hibernate 休眠自连接,hibernate,join,self-join,Hibernate,Join,Self Join,背景 我有一个列id、imageId、propertyId的表 可以有多个图像与单个属性关联,也可以有多个属性与单个图像关联 imageId-多对多-属性id 我有一个PropertyID列表,我想使用Hibernate找出与所有PropertyID关联的所有图像 问题 刚才我一次选择一个属性,使用CriteriaAPI查找与此属性ID关联的所有ImageID,我获得了ImageID列表。我在下一个查询中使用这个ImageID列表并说 选择imageId所在的imageId(在上一步中获得的im

背景

我有一个列id、imageId、propertyId的表

可以有多个图像与单个属性关联,也可以有多个属性与单个图像关联

imageId-多对多-属性id

我有一个PropertyID列表,我想使用Hibernate找出与所有PropertyID关联的所有图像

问题

刚才我一次选择一个属性,使用CriteriaAPI查找与此属性ID关联的所有ImageID,我获得了ImageID列表。我在下一个查询中使用这个ImageID列表并说

选择imageId所在的imageId(在上一步中获得的imageId),其中propertyId=x

因此,有效地,命中DB的查询数将等于PropertyID数。我不认为这是一个好的解决方案,必须对数据库进行n次访问,我尝试使用分离查询,但没有成功。有更好的解决办法吗


此外,当我最终获得IMAIDS的列表时,这是一个好主意(让我们不考虑结果的数量)将它存储在用户会话中并进行分页,还是重复整个过程是一个好主意,还是应该考虑将它存储在DB中所有用于分页的目的?< /P> < P>所以你有这样的类。(注意:我没有使用ide编写此代码,因此代码的语法可能不正确):

公共类属性{
@许多
私有列表图像;
}
公众阶级形象{
@许多
私有财产清单;
}
因此,像
selectproperty from property
这样的查询应该可以获得属性列表,您可以通过普通的Java属性来获得这些属性


这就是您要找的,还是我误解了这个问题?

您的数据库架构有一个问题:

您正试图将3个独立的关联(image-collection、image-property、collection-property)塞进一个ImageCollection表中。这不是一件好事。虽然您可能可以使用纯SQL解决这一问题(代价是该表中有大量空列的行),您将无法在Hibernate中正确映射。顺便说一句,此表不需要代理主键

您需要做的是将其拆分为3个单独的表,并在Hibernate中将您的模型映射为适当的多对多。例如:

@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}
如果您的属性非常类似于标记,请查看和/或/联合查询示例


如果属性是真正的属性(即,它们拥有所有者实体的生命周期,不能同时属于多个实体),请考虑将它们拆分为两个表(一个用于图像,另一个用于集合)使用一对多的关联。这样你就不需要上面的

IMAGE\u PROPERTIES
COLLECTION\u PROPERTIES
表了。

你已经很好地理解了,但我正在考虑避免多对多的关联。有没有其他选择?当我说要避免它时,这是因为场景实际上更复杂plex,我把它简化了一点,放在这里。事实上,它并不是那么复杂,也不是那么独特。@Shardul-你所描述的是一种多对多的关系,因此最好将其映射为一种关系。如果你想避免它,也许你应该解释一下你的实体当前映射的原因和方式。很难提出任何建议不首先理解实体层次结构
@Entity
public class Image {
  @ManyToMany
  @JoinTable(
    name="IMAGE_PROPERTIES",
    joinColumns=@JoinColumn(name="IMAGE_ID"),
    inverseJoinColumns=@JoinColumn(name="PROPERTY_ID")
  )
  private Collection<Property> properties;

  ...
}
from Image img
  left join img.properties as prop
  with prop.name in ('Tag1', 'Tag2', 'Tag3')