仅获取 returns 集合中的一项
Fetch returns only one item in collection
Table 信息:
Image table 包含其父项 mediaid 的外键 table 媒体
----------
id | mediaid | url
========================
104 | 103 | IMG_PATH
383 | 103 | IMG_PATH
384 | 103 | IMG_PATH
395 | 103 | img_path
Media 实体拥有图像集合:
private Set<Image> images = new HashSet<Image>(0)`;
@OneToMany(mappedBy = "media", targetEntity = Image.class ,cascade = CascadeType.ALL)
public Set<Image> getImages() {
return images;
}
图片实体片段:
private Media media;
@ManyToOne
@JoinColumn(name = "mediaId")
public Media getMedia() {
return media;
}
我实现了以下查询,它应该 return 一个媒体对象,其中包含所有图像的集合,其 fk 与其提供的 id 相匹配。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Media> cqObject = cb.createQuery(Media.class);
Root<Media> rootEntry = cqObject.from(Media.class);
rootEntry.fetch(Media_.images, JoinType.LEFT);
Predicate predicate = cb.equal(rootEntry.get(Media_.id), id);
cqObject.select(rootEntry).where(predicate);
Media _fetcheMedia = em.createQuery(cqObject).getSingleResult();
Media 对象的集合 returned 仅包含一个图像项。我确定数据库包含指定媒体的多个图像项。
*注意Media_只是一个代表媒体实体
的元模型class
休眠 id=103 的媒体对象
select media0_.mediaId as mediaId1_8_0_,
images1_.imageId as imageId1_6_1_,
media0_.active as active2_8_0_,
media0_.created as created3_8_0_,
media0_.description as descript4_8_0_,
media0_.listType as listType5_8_0_,
media0_.parentId as parentId6_8_0_,
media0_.propertyTypeId as property7_8_0_,
media0_.seasonId as seasonId8_8_0_,
media0_.status as status9_8_0_,
media0_.userId as userId10_8_0_,
images1_.active as active2_6_1_,
images1_.created as created3_6_1_,
images1_.imageTypeId as imageTyp5_6_1_,
images1_.imageUrl as imageUrl4_6_1_,
images1_.mediaId as mediaId6_6_1_,
images1_.mediaId as mediaId6_6_0__,
images1_.imageId as imageId1_6_0__ from media media0_
left outer join image images1_ on media0_.mediaId=images1_.mediaId where media0_.mediaId=103
我犯了一个愚蠢的错误,我忘记覆盖 Image 实体的 hashcode 和 equals 方法。添加了它们,它知道它应该工作。
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
Image other = (Image) obj;
if (id != other.id)
return false;
return true;
}
Table 信息:
Image table 包含其父项 mediaid 的外键 table 媒体
----------
id | mediaid | url
========================
104 | 103 | IMG_PATH
383 | 103 | IMG_PATH
384 | 103 | IMG_PATH
395 | 103 | img_path
Media 实体拥有图像集合:
private Set<Image> images = new HashSet<Image>(0)`;
@OneToMany(mappedBy = "media", targetEntity = Image.class ,cascade = CascadeType.ALL)
public Set<Image> getImages() {
return images;
}
图片实体片段:
private Media media;
@ManyToOne
@JoinColumn(name = "mediaId")
public Media getMedia() {
return media;
}
我实现了以下查询,它应该 return 一个媒体对象,其中包含所有图像的集合,其 fk 与其提供的 id 相匹配。
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Media> cqObject = cb.createQuery(Media.class);
Root<Media> rootEntry = cqObject.from(Media.class);
rootEntry.fetch(Media_.images, JoinType.LEFT);
Predicate predicate = cb.equal(rootEntry.get(Media_.id), id);
cqObject.select(rootEntry).where(predicate);
Media _fetcheMedia = em.createQuery(cqObject).getSingleResult();
Media 对象的集合 returned 仅包含一个图像项。我确定数据库包含指定媒体的多个图像项。
*注意Media_只是一个代表媒体实体
的元模型class休眠 id=103 的媒体对象
select media0_.mediaId as mediaId1_8_0_,
images1_.imageId as imageId1_6_1_,
media0_.active as active2_8_0_,
media0_.created as created3_8_0_,
media0_.description as descript4_8_0_,
media0_.listType as listType5_8_0_,
media0_.parentId as parentId6_8_0_,
media0_.propertyTypeId as property7_8_0_,
media0_.seasonId as seasonId8_8_0_,
media0_.status as status9_8_0_,
media0_.userId as userId10_8_0_,
images1_.active as active2_6_1_,
images1_.created as created3_6_1_,
images1_.imageTypeId as imageTyp5_6_1_,
images1_.imageUrl as imageUrl4_6_1_,
images1_.mediaId as mediaId6_6_1_,
images1_.mediaId as mediaId6_6_0__,
images1_.imageId as imageId1_6_0__ from media media0_
left outer join image images1_ on media0_.mediaId=images1_.mediaId where media0_.mediaId=103
我犯了一个愚蠢的错误,我忘记覆盖 Image 实体的 hashcode 和 equals 方法。添加了它们,它知道它应该工作。
@Override
public int hashCode() {
final int prime = 31;
int result = super.hashCode();
result = prime * result + (int) (id ^ (id >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!super.equals(obj))
return false;
if (getClass() != obj.getClass())
return false;
Image other = (Image) obj;
if (id != other.id)
return false;
return true;
}