Have you tried notExists() instead of id.eq(JPAExpressions.select(...).limit(1)) ?
jpaQueryFactory
.selectFrom(qVehicleLocation)
.innerJoin(qVehicleLocation.vehicle).fetchJoin()
.where(
JPAExpressions.selectOne()
.from(subLocation)
.where(
subLocation.vehicle.eq(qVehicleLocation.vehicle),
subLocation.createdAt.gt(qVehicleLocation.createdAt)
.or(
subLocation.createdAt.eq(qVehicleLocation.createdAt)
.and(subLocation.id.gt(qVehicleLocation.id))
)
)
.notExists()
)
.fetch();