我有这些实体
@Entity
@Table(name = "Item")
class Item(
@Column(name = "name", nullable = false)
var name: String,
@Column(name = "added_date", columnDefinition = "TIMESTAMP WITH TIME ZONE", nullable = true)
var addedDate: ZonedDateTime? = null,
@Column(name = "duration", nullable = true)
var duration: Int? = null,
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "head_of_id", nullable = false)
val headOf: HeadOf,
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
}
@Entity
@Table(name = "head_of")
class HeadOf(
@Column(name = "company", nullable = false)
var company: String,
@Column(name = "city", nullable = false)
var city: String,
@Column(name = "age", nullable = true)
var age: Int?
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
}
这是相应的存储库
interface ItemRepository : JpaRepository<Item, Long> {
fun findByHeadOfIdAndAddedDateNotNullOrDurationNotNull(
headOfId: Long,
position: ScrollPosition,
pageable: Pageable,
): Window<Item>
}
这是当前表格中的内容Item
。它是一行(它是的结果dump
)
INSERT INTO public.item VALUES (1, 'Some fancy title', '2024-12-31 07:14:42.955789+00', NULL, 1000);
如你所见,headOf
是1000L
。
现在,当我findByHeadOfIdAndAddedDateNotNullOrDurationNotNull
使用以下值调用此函数时
headOfId: 0 scrollPosition: ScrollPosition.of(…) PageRequest.of(0, 10)
它返回其中的一行。我没有想到这一点,因为headOfId
我传递的是0L
而不是1000L
。
我无法使用@Query
注释,然后我得到了这个
无法为公共抽象 org.springframework.data.domain.Window org...jpa.repository.ItemRepository.findByHeadOfIdAndAddedDateNotNullOrDurationNotNull(long,org.springframework.data.domain.ScrollPosition,org.springframework.data.domain.Pageable); 创建查询 原因:使用基于字符串的查询不支持滚动查询
有办法解决这个问题吗?
问题在于 SQL 中的运算符优先级。它的求值方式如下
解决这个问题的方法是按照这种方式编写查询(虽然很难看,但有效)
您也许还可以使用 来完成此操作
Criteria API
。