【问题标题】:Can't fetch using JPA @NativeQuery with @OneToMany. JPA join query execute after native query无法将 JPA @NativeQuery 与 @OneToMany 一起使用。 JPA 连接查询在本机查询之后执行
【发布时间】:2021-06-04 11:34:48
【问题描述】:

我正在尝试使用本机查询获取数据。但下面的查询会执行。

本机查询: Hibernate: select * from employee emp inner join department dep on emp.id = dep.dp_id where emp.id=? and dep.department=?

Hibernate: select department0_.dp_id as dp_id3_0_0_, department0_.d_id as d_id1_0_0_, department0_.d_id as d_id1_0_1_, department0_.department as departme2_0_1_ from department department0_ where department0_.dp_id=?

如何停止执行第二个查询?

@Entity
@Table(name = "employee")
public class Employee {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;
    
    private String name;

    @OneToMany
    @JoinColumn(name = "dp_id")
    private List<Department> departments;

    ...
}
@Entity
@Table(name = "department")
public class Department {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long dId;
    
    private String department;
    
    ...
}

请告诉我如何只执行本机查询?

【问题讨论】:

    标签: hibernate jpa one-to-many jpql nativequery


    【解决方案1】:

    尝试将关联更改为

    @OneToMany(fetch = FetchType.LAZY)
    

    【讨论】:

      【解决方案2】:

      User user = (User) session.createQuery("FROM User U WHERE U.username = :userName").setParameter("userName", userName) .uniqueResult();

      在hibernate中,你会这样写一个原生查询

      【讨论】:

        【解决方案3】:

        显然您正在访问departments 集合,但正如您在第一个查询中看到的那样,该集合的内容最初并未加载。要么避免访问集合以不触发延迟加载,要么在原始查询中获取集合。通过使用实体图或加入获取。通过连接提取,您可以使用如下查询:select e from Employee e join fetch e.departments where e.id = :id

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-31
          • 2020-01-29
          • 1970-01-01
          • 1970-01-01
          • 2019-08-09
          • 2014-02-15
          • 2021-02-23
          相关资源
          最近更新 更多