Eu tenho essas entidades
@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
}
e este é o repositório correspondente
interface ItemRepository : JpaRepository<Item, Long> {
fun findByHeadOfIdAndAddedDateNotNullOrDurationNotNull(
headOfId: Long,
position: ScrollPosition,
pageable: Pageable,
): Window<Item>
}
Isto é o que está atualmente na tabela Item
. É uma linha (é o resultado de um dump
)
INSERT INTO public.item VALUES (1, 'Some fancy title', '2024-12-31 07:14:42.955789+00', NULL, 1000);
Como você pode ver, headOf
é 1000L
.
Agora, quando eu chamo essa função findByHeadOfIdAndAddedDateNotNullOrDurationNotNull
com os seguintes valores
headOfId: 0 scrollPosition: ScrollPosition.of(...) SolicitaçãoDePágina.of(0, 10)
ele me retorna aquela linha que está lá. Eu não espero isso, porque o que headOfId
estou passando é 0L
e não 1000L
.
Não consigo usar uma @Query
anotação, então recebo isso
Não foi possível criar uma consulta para o resumo público org.springframework.data.domain.Window org...jpa.repository.ItemRepository.findByHeadOfIdAndAddedDateNotNullOrDurationNotNull(long,org.springframework.data.domain.ScrollPosition,org.springframework.data.domain.Pageable); Motivo: Consultas de rolagem não são suportadas usando consultas baseadas em String
Existe uma solução para isso?
O problema é a precedência do operador em SQL. Ele é avaliado assim
A solução para isso é escrever a consulta desta forma (o que é feio, mas funciona)
Você também pode fazer isso com o
Criteria API
.