【发布时间】:2019-10-17 22:27:57
【问题描述】:
我有一个简单的问题,我不确定为什么这不起作用,我希望有人解释一下我在对用户进行查询时总是获取角色以及为什么我总是获取角色。
基本上我创建了 User 类并添加了 LazyLoaded 角色列表,但是当我执行查询时,我总是得到角色,这是我不想做的事情。有人可以解释一下为什么会这样吗?
基本上我想要实现的是在我想要的时候获取角色,我的理解是,当我在查询中使用带有 LazyLoad 的 LEFT JOIN FETCH 时,应该获取所有角色...
下面我添加了所有获取角色列表的类和查询,即使我没有在查询中使用 LEFT JOIN FETCH..
我有一个简单的用户类,如下所示:
@Entity
@Table(name = "users")
data class User (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long?,
var sponsorId: Long,
var firstName: String,
var lastName: String,
var photo: String,
@Column(nullable = false, unique = true)
var username: String,
@JsonIgnore
var password: String,
@JsonIgnore
var enabled: Boolean
) {
@OneToMany(mappedBy = "userId", fetch = FetchType.LAZY)
var roles: Set<UserRole> = emptySet()
}
我还有第二个简单的类:
@Entity
@Table(name = "user_role")
data class UserRole (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long?,
@JsonIgnore
var userId: Long?,
@Enumerated(EnumType.STRING)
var role: Role
)
在我的存储库中,我有这个查询,如您所见,我没有加入 FETCHED 角色,但无论如何我得到了用户列表和角色列表......
@Repository
interface UserRepository : JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.sponsorId = :sponsorId")
fun findAllBySponsorId(@Param("sponsorId") sponsorId: Long): Set<User>
}
【问题讨论】:
-
你认为它为什么会被获取?即使你调用 user.getRoles() 进行延迟加载,你仍然会得到它们。
-
嗯,我没有在任何地方明确调用 user.getRoles(),我唯一调用的是那个查询 (findAllBySponsorId)
-
也许你正在序列化为 JSON,然后编组库自己调用所有的 getter。
-
有办法检查吗?我在返回用户列表的端点上调用此查询
标签: hibernate spring-boot jpa spring-data-jpa spring-data