gpt4 book ai didi

java - JPA 与 hibernate : Query generated by Hibernate contains duplicate

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:32 26 4
gpt4 key购买 nike

父实体

class Item{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;

@Column(name="ITEM_NAME")
private String itemName;

@OneToMany(mappedBy = "item", cascade=CascadeType.PERSIST)
private Set<Bid> bids;
....
}

子实体

class Bid{
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
private BigDecimal amount;

@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="ITEM_ID", nullable=false)
private Item item;
}
  1. 我为“商品”创建并分配了几个出价。
  2. 当我调用 item.getBids() 时,它会生成

    select bids0_.ITEM_ID as ITEM_ID3_0_0_, bids0_.id as id1_0_0_, bids0_.id as id1_0_1_, bids0_.amount as amount2_0_1_, bids0_.ITEM_ID as ITEM_ID3_0_1_ from BID bids0_ where bids0_.ITEM_ID=?

而是只包含 bidid、ITEM_ID、金额等的查询

select bid_.id, bid_.amount as amount2_0_, bid_.ITEM_ID as ITEM_ID3_0_ from BID bid_ where bid_.id=?

如果您注意到第一个查询,它在生成的查询中有两个“bids0_.ITEM_ID”和两个“bids0_.id”列。为什么会这样呢?我在这里错过了什么吗?为什么会生成这些重复的列?

最佳答案

这是因为在父实体和子实体之间发生了多个左连接。例如,在父类中,存在一对多关系,而子实体具有多对一关系。因此,当查询运行时,父级联接子级的次数与数据库中可用子行的次数相同。我在一个论坛上看到,这个问题有两种解决方案:

  • 将您的连接对象声明为 Set
  • 利用不同的根实体结果转换器

希望这个链接可能有用......<强> https://howtoprogramwithjava.com/how-to-fix-duplicate-data-from-hibernate-queries/

谢谢!

关于java - JPA 与 hibernate : Query generated by Hibernate contains duplicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com