急切地从Hibernate / JPA加载惰性项目并更正对象计数

时间:2016-12-18 16:50:41

标签: hibernate jpa spring-data

我正在使用Spring Data和Hibernate作为我的网络应用程序。我有以下实体类。

@Entity
public class Purchase{

    @Id
    @GeneratedValue
    private Long id;

    @OneToMany(fetch = FetchType.LAZY)
    private List<Item> items;
    // etc
}

我需要在每次购买时急切地加载一些购买,包括相关商品。我使用以下JPQL:

@Query("select p from Purchase p join fetch p.items where r.id in (:ids)")
List<Purchase> getPurchasersByIds(@Param("ids") List<Long> ids); 

但是,返回的对象数量不是购买数量,而是项目数量。例如,如果我只有一个购买,其中包含两个项目,则返回的列表将包含同一购买的两个对象。如何让它只返回一个带有两个急切加载项的Purchase对象?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我认为这是根据规范(不幸的)。参见JPA 2.1,ch。 4.4.5.3&#34;获取连接&#34;:

  

以下查询返回一组部门。作为副作用,即使它们不是显式查询结果的一部分,也会检索这些部门的关联员工。 [...]

SELECT d
FROM Department d LEFT JOIN FETCH d.employees
WHERE d.deptno = 1
     

[...]因此,例如,如果部门1有五名员工,则上述查询会返回对部门1实体的五次引用。

答案 1 :(得分:0)

如果您需要返回p的数量,请尝试选择count(p)