【问题标题】:JPA query returns duplicate objectsJPA 查询返回重复对象
【发布时间】: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&lt;Item&gt; findByItemId(String itemId);?
  • 它可以正常工作。但它在内部生成 2 个查询并且不执行连接操作。我想执行连接操作,这就是我使用@Query 的原因。

标签: sql spring-boot hibernate jpa join


【解决方案1】:

您应该像这样更正您的查询:

@QueryHints(value = {
   @QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false")
})
@Query("select distinct p from Item p join fetch p.itemPart where p.itemId = :itemId ")
List<Item> findAllByItemId(@Param("itemId") String itemId);

另见 this section 的休眠文档。

【讨论】:

    【解决方案2】:

    我在@Query 中添加了“distinct”,然后问题就解决了。

    @Query("SELECT distinct p FROM Item p JOIN fetch p.ItemPart n WHERE 
    p.item_id = ?1 ") 
    List<Item> findAllByItemId(String itemId);
    

    【讨论】:

      猜你喜欢
      • 2013-06-24
      • 2013-03-04
      • 2010-09-29
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2021-09-15
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多