带有Hibernate的JPA:Hibernate生成的查询包含重复内容

时间:2016-09-06 11:41:48

标签: java hibernate jpa

父实体

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=?
    
  3. 而是一个只有bidid,ITEM_ID,金额的查询,比如

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

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

1 个答案:

答案 0 :(得分:0)

由于多个左连接发生在父母和子女的情况下。例如,在父类中,有一个到多个,孩子有多对一的关系。因此,当查询运行时,父级将子级连接到db中可用的子行的次数。 我在其中一个论坛上看到,这个问题有两个解决方案:

  • 将您的加入对象声明为Set
  • 利用独特的根实体 结果变压器

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

谢谢!