Forge
1.x
Docs/Forge/Repository and Pagination
Open

Deprecated

Use Grove instead.

Reading1 min
Updated31 Jul 2026
Sourcev1/extensions/database/repository-pagination.mdx

Generic Repository01

Repository[T] wraps Bun queries with common CRUD operations.

Create Repository

repo := database.NewRepository[User](db)

db can be *bun.DB or bun.Tx through the shared IDB interface.

Core Methods

  • FindByID

  • FindOne

  • FindAll

  • FindAllWithDeleted

  • Exists

  • Count

  • Create

  • CreateMany

  • Update

  • UpdateColumns

  • Delete

  • DeleteMany

  • SoftDelete

  • RestoreSoftDeleted

  • Truncate

Query Options

Built-in query option helpers:

  • WithLimit(limit)

  • WithOffset(offset)

  • WithOrder(column, direction...)

  • WhereActive()

  • WhereDeleted()

  • WithRelation(relation)

  • WithRelations(relations...)

Bulk Operations02

Batch-oriented operations:

  • BulkInsert

  • BulkInsertWithOptions

  • BulkUpdate

  • BulkUpsert

  • BulkDelete

  • BulkSoftDelete

  • BulkInsertWithProgress

  • BulkUpdateWithProgress

  • ChunkSlice

DefaultBatchSize is 1000 when not specified.

Offset Pagination03

Use OffsetPagination + Paginate[T] for classic page/limit APIs.

result, err := database.Paginate[User](ctx, query, database.OffsetPagination{
    Page:     2,
    PageSize: 20,
    Sort:     "created_at",
    Order:    "desc",
})

Result includes:

  • Data

  • Page, PageSize

  • TotalPages, TotalCount

  • HasNext, HasPrev

Cursor Pagination04

Use CursorPagination + PaginateCursor[T] for large datasets and stable pagination.

result, err := database.PaginateCursor[User](ctx, query, database.CursorPagination{
    Cursor:    cursor,
    PageSize:  50,
    Sort:      "id",
    Direction: "forward",
})

Result includes:

  • Data

  • NextCursor

  • PrevCursor

  • HasNext, HasPrev

Mapping Utilities05

For DTO conversions and data shaping:

  • MapTo, MapSlice, MapPointer

  • MapPaginated, MapCursor

  • MapError variants

  • FilterSlice, GroupBy, IndexBy, Pluck, Unique, Partition

These are useful when keeping repository models separate from API response models.