【发布时间】:2021-02-08 20:55:55
【问题描述】:
我有一个通常被懒惰地获取的属性:
@Entity
class Version(...,
@Basic(fetch = FetchType.LAZY)
@Type(type = "text")
var mappings: String? = null) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private val id = 0
}
但有时我需要急切地获取它。如何使用 QueryDsl 做到这一点? 这是我目前拥有的:
JPAQuery<Any>(entityManager).from(QVersion.version)
.where(...)
.select(QVersion.version)
.fetchOne()
但是当我稍后尝试访问该属性时,这会导致异常:
org.hibernate.LazyInitializationException: 无法执行请求的延迟初始化 [Version.mappings] - 没有会话并且设置不允许在会话之外加载
【问题讨论】:
-
我相信您已经配置了字节码增强功能,以便能够延迟加载普通字段(不是实体关系)。我可能完全错了;但是这样做的全部目的是确保该字段是延迟加载的。如果您有时需要急切地加载它;我建议将该字段提取到一个单独的实体(当然具有相同的表和
Version的ID),即VersionMappings,并使用实体关系而不是字段。所以你可以像from(QVersion.version).innerJoin(QVersion.version.mappings).fetchJoin().select(QVersion.version)那样急切地加载惰性实体关系。 -
@feanor07 是的,字节码增强已开启。这听起来像是一个很好的解决方案。你能用这两个实体的例子把它变成一个答案吗?我在问题中的版本类中添加了一个简单的 id。
-
我会在几个小时后为你添加一个工作示例;但它将是 Java 而不是 kotlin;我希望这很好:D
-
当然,我可以自己翻译成 kotlin。我已经尝试了你所说的,但没有得到它的工作,所以期待这个例子。
标签: hibernate kotlin jpa querydsl