【发布时间】:2021-09-14 21:00:23
【问题描述】:
我在 db 中有这种关系。在 Item 表中,主键是 Item_id 和 site。 ItemPart 表的主键也是它们,还有其他 2 个主键。这些表是按 item_id 和站点作为一对多关系连接的。
这是 2 个实体类。
public class Item {
@Id
@Column(name = "item_id", updatable = false, nullable = false)
private String itemId;
@Id
@Column(name = "site", updatable = false, nullable = false)
private String site;
@OneToMany(mappedBy = "item")
private List<ItemPart> itemPart;
...
public class ItemPart {
@Id
@Column(name = "item_id", updatable = false, nullable = false)
private String itemId;
@Id
@Column(name = "site", updatable = false, nullable = false)
private String site;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "item_id", referencedColumnName = "item_id", insertable = false, updatable = false),
@JoinColumn(name = "site", referencedColumnName = "site", insertable = false, updatable = false)
})
private Item item;
...
我想要的是给 item_id 返回如下结果。如果我给 item_id = "100" 并且有一个 item_id = 100 的项目和两个 itemParts 的 item_id =100 和 site=S01。
{
"Item":[
{
"item_id":"100",
"site":"S01",
"itemPart":[
{
"item_id":"100",
"site":"S01",
"another_pk": "x"
},
{
"item_id":"100",
"site":"S01",
"another_pk": "y"
}
],
...
}
]
但实际上,它返回 2 个相似的项目对象,每个对象都有 2 个 itemPart 对象。像这样。
{
item:
itemPart:[
{...},
{...}
]
},
{
item:
itemPart:[
{...},
{...}
]
}
我想解决这个问题,我正在使用 JPA。任何人都可以在这里找到问题所在。
@Query("SELECT p FROM Item p JOIN fetch p.ItemPart n WHERE
p.item_id = ?1 ")
List<Item> findAllByItemId(String itemId);
【问题讨论】:
-
如果您使用以下查询会发生什么:
"SELECT p FROM Item p WHERE p.item_id = ?1"?或者如果您删除@Query 并使用方法查询List<Item> findByItemId(String itemId);? -
它可以正常工作。但它在内部生成 2 个查询并且不执行连接操作。我想执行连接操作,这就是我使用@Query 的原因。
标签: sql spring-boot hibernate jpa join