給定以下模型:
@Entity
open class Parent {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
open val id: Long? = null
@OneToMany(cascade = [CascadeType.ALL])
@JoinColumn(name = "parent_id")
@OrderColumn(name = "version")
private var children: MutableList<Child> = mutableListOf()
fun addChild(child: Child) {
child.parent = this
children.add(child)
}
fun getChildPosition(child: Child): Int {
return children.indexOf(child)
}
}
@Entity
open class Child {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
open val id: Long? = null
@ManyToOne
@JoinColumn(name = "parent_id")
open var parent: Parent? = null
@Column(nullable = false)
open var data: String? = null
@Column(name = "version")
open var version: Int? = null
@PrePersist
@PreUpdate
private fun prepareVersion() {
if (parent != null) {
version = parent?.getChildPosition(this)
}
}
}
interface MyProjection {
// parent.id, child.id, child.version, child.data
}
@Repository
interface ParentRepository : JpaRepository<Parent, UUID> {
@Query("?")
fun findWithLatestChild(id: Long?): MyProjection?
}
是否可以使用 JPA 方法命名約定或 JPQL 查詢來執行以下操作:
- 在 parent.id 上加入父母和孩子。
- 對版本 (desc) 上的子項進行排序并將結果限制為 1。
- 如上面模擬投影界面中所述,投影屬性/列。
更新:如果這不可行,以下本機查詢描述了我的意圖:
select p.id,c.* from parent p join child c on p.id = c.parent_id
where p.id = :parentId
order by c.version desc
limit 1
uj5u.com熱心網友回復:
所以你可以創建一個這樣的查詢:
@Query("select new packagename.MyProjection(c.parent.id, c.id, c.version, c.data ) "
"from Child where c.parent.id = :parentId order by c.version desc")
fun findWithLatestChild(id: Long?, pageable: Pageable): MyProjection?
然后使用 PageRequest 呼叫它以將結果限制為 1
findWithLatestChild(PageRequest.of(0,1));
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/356342.html
