Spring数据JPA忽略查询方法上的fetchmode

时间:2019-02-17 14:00:26

标签: hibernate spring-data-jpa

我有具有传递关系的实体。因此,实体A被一对一映射到实体B,实体B被一对一映射到实体C。 实体A有一个属性userID,它不是主键,我需要从数据库中获取用户ID的所有记录。由于要求,我想尽快获取A和B的子记录。我已经使用FetchMode连接注释了实体,并且我的存储库具有方法findByUserId(int userId)。 我正在使用带有休眠状态的Spring数据JPA作为底层ORM。 执行上述查询方法会触发多个查询,尽管我希望只有一个带有join的查询会被触发。

我已经尝试了EntityGraphs,使用NamedQuery注释了我的存储库方法,尝试了双向映射实体ManyToOne,但是似乎没有任何作用。

@Entity
@Table(name = "A_Master")
public class EntityA{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    private int userId;

    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_reservationId")
    @Fetch(FetchMode.JOIN)
    private List<EntityB> bEntities= new ArrayList<>();

}

@Entity
@Table(name = "Entity_B")
public class EntityB{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @OneToMany(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "FK_journeyId")
    @Fetch(FetchMode.JOIN)
    private List<EntityC> cEntities = new ArrayList<>();
}

public interface ReservationRepository extends JpaRepository<EntityA, Integer>
{
    public List<EntityA> findByUserIdAndStatus(String userId);
}

1 个答案:

答案 0 :(得分:1)

from pynput.mouse import Listener, Controller, Button mouse = Controller() trigger = False def on_click(x, y, button, pressed): global trigger if str(button) == "Button.middle" and pressed: trigger = True print "Middle button has been pressed" if str(button) == "Button.middle" and pressed == False: print "Middle button has been unpressed" trigger = False while True: print("Looping") if trigger == True: mouse.click(Button.left, 1) with Listener(on_click = on_click) as listener: listener.join() 定义如何加载集合。是要立即加载还是要延迟加载(按需)。

相反,FetchType定义了加载集合的机制。当您用以下标记您的收藏集后:

FetchMode

这是一个废话,因为默认情况下,OneToMany的@OneToMany(cascade = CascadeType.PERSIST) @Fetch(FetchMode.JOIN) 是惰性的,但是您不能在惰性集合上使用JOIN机制。为了拥有JOIN,您需要将其设置为EAGER。

休眠中的默认FetchMode是SELECT,这是首选的fetchmode,因为在访问基于键的高速缓存使用方面,它非常有效。我建议您将fetchTypeFetchType.Lazy已启用的集合批处理一起使用。