我有具有传递关系的实体。因此,实体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);
}
最佳答案
FetchType
定义如何加载集合。是要立即加载还是要延迟加载(按需)。
相反,FetchMode
定义了加载集合的机制。将收藏集标记为:
@OneToMany(cascade = CascadeType.PERSIST)
@Fetch(FetchMode.JOIN)
这是胡说八道,因为默认情况下,OneToMany的
fetchType
是惰性的,但是您不能在惰性集合上具有JOIN机制。为了拥有JOIN,您需要将其设置为EAGER。休眠中的默认FetchMode是SELECT,这是首选的fetchmode,因为在基于键的访问中,它对于缓存使用非常有效。我建议您将
FetchType.Lazy
与FetchMode.SELECT
一起使用并启用集合批处理。关于java - Spring数据JPA忽略查询方法上的fetchmode,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54733999/